我是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移动到动态内存时它会被释放吗?它是如何工作的?
答案 0 :(得分:15)
您需要了解内存泄漏与指针无关(实际上:从不 - 即使很多人会声称不同的东西)。指针的整个业务只是误导。
它们与动态内存分配和解除分配不匹配。
new
的每个分配都必须通过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.
现代C ++代码使用极少数(在大多数情况下:无)手动动态内存分配。这样,你就不会有泄漏。原则上。这非常好,所以这样做。您可以使用标准容器和智能指针代替手动动态内存分配,为您处理内存管理。
答案 1 :(得分:9)
第一行(int *ptr;
)不分配任何动态内存,因此没有内存泄漏。您看到的值未初始化。它不是有效的指针。在为其赋值之前,不应删除指针。这样做将是未定义的行为。
答案 2 :(得分:2)
在C / C ++中,内存不会自动释放。所以,是的,如果你这样做:
YourType* ptr = new YourType();
ptr = new YourType();
你会有内存泄漏。
但在您的情况下,您没有内存泄漏,因为第一个值不是有效的内存位置。这是一个未初始化的指针。
答案 3 :(得分:0)
不,这不是内存泄漏。不同之处在于,当你说“new int
”时,你告诉C ++保留一块内存来保存int
;如果你失去指向该保留块的指针,那么它就无法恢复,也无法释放,因此它是一个泄漏,因为它永远不会被重用。
只是在指针变量中保留一些位不会执行任何魔法;他们只是位。它使用new
分配内存可能会让你陷入困境。一旦你预留了一个街区,你必须确保不要丢失它。