我是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++代码使用极少数(在大多数情况下:否)手动动态内存分配.这样,你就不会有泄漏.原则上.这非常好,所以这样做.您可以使用标准容器和智能指针代替手动动态内存分配,这些容器和智能指针可以为您处理内存管理.
第一行(int *ptr;)不分配任何动态内存,因此没有内存泄漏.您看到的值未初始化.它不是有效的指针.在为其赋值之前,不应删除指针.这样做将是未定义的行为.