这是内存泄漏吗?

时间:2012-08-08 19:48:14

标签: c++

我是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 个答案:

答案 0 :(得分:15)

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

它们与动态内存分配和解除分配不匹配。

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 ++代码使用极少数(在大多数情况下:)手动动态内存分配。这样,你就不会有泄漏。原则上。这非常好,所以这样做。您可以使用标准容器和智能指针代替手动动态内存分配,为您处理内存管理。

答案 1 :(得分:9)

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

答案 2 :(得分:2)

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

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

你会有内存泄漏。

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

答案 3 :(得分:0)

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

只是在指针变量中保留一些位不会执行任何魔法;他们只是位。它使用new分配内存可能会让你陷入困境。一旦你预留了一个街区,你必须确保不要丢失它。