是内存泄漏吗?
Is it a memory leak?
我是 c++ 的新手,我刚刚了解了动态内存和内存泄漏。
据我了解,当创建一个指针(int *ptr = new int
),然后更改他所指向的地址时,旧地址仍然存在/分配。(如果我错了,请纠正我)。
所以我想到了这个:
int *ptr;
ptr = new int;
首先PTR填充随机(或不?)地址,然后我更改它,所以旧的保留?如果我尝试此代码:
int *ptr;
cout << ptr << endl ;
ptr = new int;
cout << ptr << endl ;
我得到:
0x401a4e
0x6d2d20
这是否意味着0x401a4e是内存泄漏的一部分?还是在 ptr 移动到动态内存时释放?它是如何工作的?
你需要明白内存泄漏与指针无关(真的:从来没有 - 即使很多人会声称不同的东西)。带有指针的整个业务只是误导。
它们是关于动态内存分配和解除分配的不匹配。
通过new
的每个分配都必须与一个通过delete
的释放相匹配。malloc
和free
以及new[]
和delete[]
(以及其他可以想象的动态资源分配功能)也是如此。
int* x; // Not a memory leak: no dynamic allocation
new int; // Memory leak: we acquired a value via `new` and lost it.
int* y = new int;
int* z = y;
delete y; // Not a memory leak any more: we freed the memory.
delete z; // Oooh, bad: we deleted a value twice. The horror.
现代C++代码使用很少(在大多数情况下:没有)手动动态内存分配。这样,您就不会有泄漏。原则上。这很好,所以去做吧。您可以使用标准容器和智能指针为您处理内存管理,而不是手动动态内存分配。
第一行(int *ptr;
)不分配任何动态内存,因此没有内存泄漏。您看到的值未初始化。它不是有效的指针。在为指针赋值之前,不应删除指针。这样做将是不确定的行为。
不,这不是内存泄漏。不同之处在于,当您说" new int
"时,您是在告诉C++保留一个内存块来保存int
;如果随后丢失了指向该保留块的指针,则无法恢复,也无法释放,因此它是泄漏,因为它永远无法重用。
仅仅在指针变量中保存一些位不会执行任何魔术;它们只是位。它使用可能会给您带来麻烦的new
分配内存。一旦你保留了一个区块,你必须确保不会丢失它。
在 C/C++ 中,内存不会自动释放。所以,是的,如果你这样做:
YourType* ptr = new YourType();
ptr = new YourType();
您将有内存泄漏。
但在您的情况下,您没有内存泄漏,因为第一个值不是有效的内存位置。它是一个未初始化的指针。
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存