是内存泄漏吗?

Is it a memory leak?

本文关键字:泄漏 内存      更新时间:2023-10-16

我是 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的释放相匹配。mallocfree以及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();

您将有内存泄漏。

但在您的情况下,您没有内存泄漏,因为第一个值不是有效的内存位置。它是一个未初始化的指针。