C++:在以下情况下内存是否会泄漏?

Dan*_*Dos 1 c++ memory-leaks

标题是问题.

我仍然不太了解动态分配存储的行为.

#include <utility>
int main() {
    // Case 1:
    volatile char *c1 = new char; // I'm gonna make these volatile, so the compiler won't change the code.
    volatile char *d1 = c1;
    delete d1;
    // Case 2:
    volatile char *c2 = new char[4];
    volatile char *d2 = c2;
    delete []d2;
    // Case 3:
    volatile char *c3 = new char;
    volatile char *d3 = std::move(c3);
    delete d3;
    // Case 4:
    volatile char *c4 = new char[4];
    delete c4++;
    delete []c4;
    // Case 5:
    volatile char *c5 = new char[4];
    for (int i = 0; i < 4; ++i)
        delete c5++;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在每种情况下内存都会泄漏吗?

Nia*_*all 8

案例1至3:无泄漏.

案例4和5; 解除分配会导致未定义的行为.您正在从没有最初分配值的指针中删除.

为什么1到3没有泄漏?您匹配适当的deletedelete[]与使用newnew[]; 并且它们成对匹配,每次分配一次解除分配.

我假设示例很简单,只是为了演示分配,但是要注意指针没有"重置"到NULL(或nullptr),因此一旦取消分配,对先前分配的内存的任何访问都是未定义的.


旁注std::move,它是否c3指针nullptr?不,不.在std::move实际上并没有"动"任何事情,它只是改变了价值范畴,看到这个答案一些示例代码.


Pup*_*ppy 6

情况4和5是未定义的行为,因此无法确定内存是否泄漏.

对于其他情况,内存不会泄漏.但是,值得说明的是使用它new并且delete完全是非常糟糕的,你应该总是使用资源管理类来保存内存.或者更简单地说,你不应该首先提出这个问题.