gpt4 book ai didi

c++ - std::auto_ptr、delete[] 和泄漏

转载 作者:可可西里 更新时间:2023-11-01 18:12:13 26 4
gpt4 key购买 nike

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

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

WinXP sp2,编译器:BCB.05.03

最佳答案

因为你(不)幸运。 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]);
}

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


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

char 没有析构函数,所以它只会删除 p 指向的内存。在我上面的代码中,它不会会破坏数组中的每个元素(因为它不会调用delete[]),所以一些 Foo 会保留它们的本地 bar 变量 un -删除。

关于c++ - std::auto_ptr、delete[] 和泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1198577/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com