在这两种情况中,哪一种会导致内存泄漏
which amongst these two cases would result in memory leak
正在使用删除:
int** a=new int*;
**a=5;
delete a;
使用删除[]:
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 中的整数可能已被删除但未更改(没有充分理由立即获得垃圾值)。
我应该怎么做才能找出答案(或答案是什么)。
int** a=new int*;
**a=5;
您已经完全脱离了这两行 rails。您分配了一个指向 int
的新指针,它没有指向任何东西。然后你尝试设置它指向的 int
,但它没有指向任何 int
.
这与以下内容没有区别:
int *a;
*a = 5;
所以这之后没有任何意义,因为您已经将 5
写入某个随机内存区域,也许。
int** a=new int*;
**a=5;
delete a;
这是错误的,因为您分配了一个 int*
并且之后没有将其指向 int
。通过 *a
访问 int*
本身是可以的,但是通过额外的 *
访问 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;
与上述相同的问题 - 通过 **a
分配给不存在的 int
- 但更糟糕的是,现在你也不匹配 new
和 delete[]
。更多 未定义的行为 。 delete
只能与 new
一起使用,delete[]
只能与 new[]
一起使用。
int** a=new int*;
**a=5;
int* b=new int;
b=*(a);
delete[] a;
cout<<"*b: "<<*b;
现在,这只是不良行为的高潮。不仅是你:
通过**a
分配给一个不存在的int
不匹配 new
和 delete[]
但你也是:
泄漏了您最初分配给 b
指向的 int
。您随后使用新的(无效的)int*
值重新分配 b
,失去对您分配的 int
的访问权限。您没有希望使用有效的 delete
语句来释放 int
.
更糟糕的是,在 delete
存储在已分配的 int*
中的内存地址之后,您正在取消引用 b
以访问 int
到 b
(并且 int*
对取消引用无效)。
这段代码就是各种未定义的行为。
正在使用删除:
int** a=new int*;
**a=5;
delete a;
使用删除[]:
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 中的整数可能已被删除但未更改(没有充分理由立即获得垃圾值)。
我应该怎么做才能找出答案(或答案是什么)。
int** a=new int*;
**a=5;
您已经完全脱离了这两行 rails。您分配了一个指向 int
的新指针,它没有指向任何东西。然后你尝试设置它指向的 int
,但它没有指向任何 int
.
这与以下内容没有区别:
int *a;
*a = 5;
所以这之后没有任何意义,因为您已经将 5
写入某个随机内存区域,也许。
int** a=new int*; **a=5; delete a;
这是错误的,因为您分配了一个 int*
并且之后没有将其指向 int
。通过 *a
访问 int*
本身是可以的,但是通过额外的 *
访问 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;
与上述相同的问题 - 通过 **a
分配给不存在的 int
- 但更糟糕的是,现在你也不匹配 new
和 delete[]
。更多 未定义的行为 。 delete
只能与 new
一起使用,delete[]
只能与 new[]
一起使用。
int** a=new int*; **a=5; int* b=new int; b=*(a); delete[] a; cout<<"*b: "<<*b;
现在,这只是不良行为的高潮。不仅是你:
通过
**a
分配给一个不存在的不匹配
new
和delete[]
int
但你也是:
泄漏了您最初分配给
b
指向的int
。您随后使用新的(无效的)int*
值重新分配b
,失去对您分配的int
的访问权限。您没有希望使用有效的delete
语句来释放int
.更糟糕的是,在
delete
存储在已分配的int*
中的内存地址之后,您正在取消引用b
以访问int
到b
(并且int*
对取消引用无效)。
这段代码就是各种未定义的行为。