在这两种情况下会导致内存泄漏

时间:2020-05-07 00:30:49

标签: c++ delete-operator

使用删除:

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

我应该怎么做才能找出答案(或答案是什么)。

2 个答案:

答案 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-但更糟的是,因为现在您同时也错配了newdelete[]。更多未定义行为。您只能将deletenew一起使用,delete[]new[]都可以使用。


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

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

  • 通过int分配给不存在的**a

  • newdelete[]不匹配

但是你也是:

  • 释放最初分配给int指向的b。之后,您将使用新的(无效)b值重新分配int*,从而失去对您分配的int的访问权限。您根本没有希望使用有效的delete语句来释放该int

  • 更糟糕的是,您在b处理分配给{{1的int中存储的内存地址之后,正在引用delete来访问int* }}(并且b无效,因此请先取消引用)。

此代码只是各种未定义行为

相关问题