4

我是 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移动到动态内存时释放?它是如何工作的?

4

4 回答 4

15

您需要了解内存泄漏与指针无关(真的:从来没有——即使很多人会声称不同的东西)。有指针的整个业务只是误导。

它们是关于动态内存分配和释放的不匹配。

每个分配 vianew必须与一个释放 via匹配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++ 代码很少使用(在大多数情况下:没有)手动动态内存分配。这样,您就不会发生泄漏。原则。这非常好,就这样做吧。您可以使用标准容器和智能指针来为您处理内存管理,而不是手动动态分配内存。

于 2012-08-08T19:54:28.333 回答
8

第一行 ( int *ptr;) 没有分配任何动态内存,因此没有内存泄漏。您看到的值未初始化。它不是一个有效的指针。在给它赋值之前,你不应该删除指针。这样做将是未定义的行为。

于 2012-08-08T19:50:12.020 回答
1

不,这不是内存泄漏。不同之处在于,当您说“ new int”时,您是在告诉 C++ 保留一块内存来保存int; 如果您随后丢失了指向该保留块的指针,那么它就无法恢复,也无法释放,因此它是一个泄漏,因为它永远不能被重用。

仅仅在指针变量中保存一些位不会产生任何魔力。它们只是一点点。使用它分配内存new会给你带来麻烦。一旦你保留了一个区块,你必须确保不会丢失它。

于 2012-08-08T19:51:07.797 回答
1

在 C/C++ 中,内存不会自动释放。所以,是的,如果你这样做:

 YourType* ptr = new YourType();
 ptr = new YourType();

你会有内存泄漏。

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

于 2012-08-08T19:51:56.777 回答