在这两种情况中,这将导致存储器泄漏

which amongst these two cases would result in memory leak

本文关键字:泄漏 存储器 两种 情况      更新时间:2024-05-23

使用delete:

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中的整数可能已经被删除,但没有更改(没有充分的理由提前获得垃圾值(。

我该怎么做才能找到答案。

int** a=new int*;
**a=5;

你已经完全偏离了这两条线的轨道。您为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[]。更多未定义的行为。您只能将deletenew一起使用,而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'读取存储在分配给bint*中的内存地址之后,您正在取消引用b以访问int(并且int*一开始对取消引用无效(。

此代码只是所有类型的未定义行为