在这两种情况中,这将导致存储器泄漏
which amongst these two cases would result in memory leak
使用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
-但更糟的是,因为现在您也不匹配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
'读取存储在分配给b
的int*
中的内存地址之后,您正在取消引用b
以访问int
(并且int*
一开始对取消引用无效(。
此代码只是所有类型的未定义行为。
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- Klocwork Inside的资源泄漏
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 瓦尔格林德的内存泄漏使用新的
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- 三网格 - 泄漏存储器