在这两种情况中,哪一种会导致内存泄漏

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 - 但更糟糕的是,现在你也不匹配 newdelete[]。更多 未定义的行为 delete 只能与 new 一起使用,delete[] 只能与 new[] 一起使用。


int** a=new int*;
**a=5;
int* b=new int;
b=*(a);
delete[] a;
cout<<"*b: "<<*b;

现在,这只是不良行为的高潮。不仅是你:

  • 通过**a

  • 分配给一个不存在的int
  • 不匹配 newdelete[]

但你也是:

  • 泄漏了您最初分配给 b 指向的 int。您随后使用新的(无效的)int* 值重新分配 b,失去对您分配的 int 的访问权限。您没有希望使用有效的 delete 语句来释放 int.

  • 更糟糕的是,在 delete 存储在已分配的 int* 中的内存地址之后,您正在取消引用 b 以访问 intb(并且 int* 对取消引用无效)。

这段代码就是各种未定义的行为