这是内存泄漏吗?

Bar*_*rry 4 c++

我是c ++的新手,我刚学会了动态内存和内存泄漏.

根据我的理解,在创建指针(int *ptr = new int),然后更改他指向的地址时,旧地址仍然存在/已分配.(如果我是冤枉,请纠正我).

所以我想到了这个:

int *ptr;
ptr = new int;
Run Code Online (Sandbox Code Playgroud)

第一个ptr是填充随机(或不是?)地址,然后我改变它,所以旧的地址保留?如果我尝试这个代码:

int *ptr;
cout << ptr << endl ;
ptr = new int;
cout << ptr << endl ;
Run Code Online (Sandbox Code Playgroud)

我明白了:

0x401a4e
0x6d2d20
Run Code Online (Sandbox Code Playgroud)

这是否意味着0x401a4e是内存泄漏的一部分?或者当ptr移动到动态内存时它会被释放吗?它是如何工作的?

Kon*_*lph 15

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

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

每个分配via new必须与一个 deallocation via 匹配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.
Run Code Online (Sandbox Code Playgroud)

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

  • @Grizzly C++ 03和C++ 11(包括编译器和库)的许多创新的重点是减少手动动态内存分配的需要.如果你发现自己使用了很多这些,那么你可能做错了什么.普遍使用运行时多态类层次结构就是这样一个错误:它们被过度使用.C++提供了许多功能,使得这种层次结构在许多情况下都是冗余的. (3认同)

Mar*_*ers 8

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

  • 虽然如果你现在做另一个ptr = new int,而不删除旧指针,那么你将泄漏内存. (4认同)