使用删除:
int** a=new int*;
**a=5;
delete a;
使用delete []:
int** a=new int*;
**a=5;
delete[] a;
要找出答案,我尝试这样做-
int** a=new int*;
**a=5;
int* b=new int;
b=*(a);
delete[] a;
cout<<"*b: "<<*b;
获取输出-5
但是我怀疑存储在b中的整数可能已被删除但没有更改(没有充分的理由马上获得垃圾值)。
我应该怎么做才能找出答案(或答案是什么)。
答案 0 :(得分:2)
int** a=new int*;
**a=5;
通过这两行,您已经完全脱离了轨道。您为int
分配了一个新指针,该指针没有指向任何内容。然后,您尝试设置它指向的int
,但它不指向任何int
。
这与以下内容没有什么不同:
int *a;
*a = 5;
所以自从您将5
写到某个随机的内存区域之后,这之后没有任何意义。
答案 1 :(得分:1)
int** a=new int*; **a=5; delete a;
这是错误的,因为您分配了int*
且之后没有将其指向int
。可以通过int*
访问*a
本身,但是不能通过额外的int
访问*
。这是未定义行为。
您需要添加其他int
,例如:
int** a=new int*;
*a = new int; // <-- here
**a = 5; // <-- OK!
delete *a; // <-- and don't forget this!
delete a;
int** a=new int*; **a=5; delete[] a;
与上述相同的问题-通过int
分配给不存在的**a
-但更糟的是,因为现在您同时也错配了new
和delete[]
。更多未定义行为。您只能将delete
和new
一起使用,delete[]
和new[]
都可以使用。
int** a=new int*; **a=5; int* b=new int; b=*(a); delete[] a; cout<<"*b: "<<*b;
现在,这只是不良行为的高潮。你不仅是:
通过int
分配给不存在的**a
new
和delete[]
不匹配
但是你也是:
释放最初分配给int
指向的b
。之后,您将使用新的(无效)b
值重新分配int*
,从而失去对您分配的int
的访问权限。您根本没有希望使用有效的delete
语句来释放该int
。
更糟糕的是,您在b
处理分配给{{1的int
中存储的内存地址之后,正在引用delete
来访问int*
}}(并且b
无效,因此请先取消引用)。
此代码只是各种未定义行为。