std :: auto_ptr,删除[]和泄漏

Xen*_*gem 7 c++ memory-leaks auto-ptr

为什么这个代码并不会导致内存泄漏?

int iterCount = 1000;
int sizeBig = 100000;
for (int i = 0; i < iterCount; i++)
{
   std::auto_ptr<char> buffer(new char[sizeBig]);
}
Run Code Online (Sandbox Code Playgroud)

WinXP sp2,编译器:BCB.05.03

GMa*_*ckG 15

因为你(非)幸运.auto_ptr电话delete,而不是delete [].这是未定义的行为.

尝试做这样的事情,看看你是否幸运:

struct Foo
{
    char *bar;
    Foo(void) : bar(new char[100]) { }
    ~Foo(void) { delete [] bar; }
}

int iterCount = 1000;
int sizeBig = 100000;
for (int i = 0; i < iterCount; i++)
{
   std::auto_ptr<Foo> buffer(new Foo[sizeBig]);
}
Run Code Online (Sandbox Code Playgroud)

这里的想法是你的析构函数Foo不会被调用.


原因是这样的:当你说delete[] p,实现delete[]是假设转到数组中的每个元素,调用它的析构函数,然后释放p指向的内存.同样,delete p假设在p上调用析构函数,然后释放内存.

char没有析构函数,所以它只是删除p指向的内存.在我上面的代码中,它不会破坏数组中的每个元素(因为它没有调用delete[]),因此一些Foo将使其本地条形变量不被删除.