这是内存泄漏吗?
Posted
技术标签:
【中文标题】这是内存泄漏吗?【英文标题】:Is this a memory leak? 【发布时间】:2011-02-20 15:01:26 【问题描述】:char *pointer1;
char *pointer2;
pointer1 = new char[256];
pointer2 = pointer1;
delete [] pointer1;
换句话说,我也必须做delete [] pointer2
吗?
谢谢!
【问题讨论】:
根据经验,delete
的数量通常应该与new
的数量匹配。
你不删除指针,你删除了它们指向的东西。
【参考方案1】:
不,该代码很好,不会泄漏内存。
您只需要使用一次 delete[],因为您只使用了一个 new 来为内存分配一个区域,即使有两个指针指向同一个内存。
【讨论】:
正确。事实上,您绝不能 - 尝试两次delete
同一个内存块会导致未定义的行为。
还应注意,任何尊重pointer2
的尝试也会导致未定义的行为。
side.. 正如你正在学习.. 我会说设置 pointer1 = NULL; 是个好主意。作为对删除的反射。我看过一堆代码,其中删除了指针,但后来应用程序执行了 if(pointer1)..
不幸的是,这里的pointer2
无济于事,仍然是一个很好的指导方针。【参考方案2】:
一个简单的规则:您需要与new
s 一样多的delete
s。更好的是,使用智能指针或容器之类的东西来为您处理它。
还有一个小问题:一旦你在pointer1
上调用delete
,pointer2
就会变成一个“悬空指针”。
【讨论】:
非常正确,但我认为它更明显:)【参考方案3】:这不是泄漏,而是自找麻烦。 pointer2
指向谁知道你删除pointer1
。这就是所谓的“悬空指针”。使用它在最好的情况下会导致段错误,在最坏的情况下可能会导致最终分配相同位置的任何东西出现神秘的数据损坏。
【讨论】:
【参考方案4】:虽然它不会泄漏内存,但如果你想明确一点,你应该将 point1
和 point2
都设置为 NULL(并以这种方式初始化它们。)
【讨论】:
【参考方案5】:此外,考虑使用 Boost 库中的 boost::shared_ptr<>
。这是自切片面包以来最棒的事情。
typedef boost::shared_ptr<TypeX> StrRef;
foo()
StrRef pointer1(new TypeX);
while(something)
StrRef pointer2 = pointer1;
// do stuff
return;
当指向它的最后一个指针超出范围时,数据 (TypeX
) 将被删除。如果您不需要引用计数,您可以使用内置的 auto_ptr<>
类型做类似的事情:
typedef auto_ptr<TypeX> StrRef;
foo()
StrRef pointer1(new TypeX);
while(something)
TypeX * pointer2 = pointer1.get();
subroutine(pointer2);
if (condition) return;
return;
只要pointer1
超出范围,它就会删除数据。这样做的好处是您不必记住在底部的 return 语句之前放置一个 delete ,并且如果 pointer1
由于任何其他原因超出范围(即从循环中间返回,或 @987654328 @ 抛出异常,那么数据仍然会被正确释放。
我没有测试过这段代码,所以你必须自己检查文档中的auto_ptr<>
和boost::shared_ptr<>
。
我强烈建议尽可能多地使用 Boost 库。它是由专业人士编写的,它基本上是 C++ 扩展的暂存区。
【讨论】:
【参考方案6】:delete
删除由new
分配的内存。因为你只有一个new
,所以你只需要一个delete
。
【讨论】:
【参考方案7】:仅在使用过 New 后才使用 Delete
最好的做法是将pointer2设置为NULL,但如果不这样做就不会发生内存泄漏
【讨论】:
【参考方案8】:每个new
都应该有一个,并且只有一个,匹配delete
。如果您删除了另一个指针,您将违反该规则。
【讨论】:
【参考方案9】:你在这里所做的只是告诉new char[256]
分配的内存块将同时被pointer1
和pointer2
指向。
如果你在后面写delete[] pointer2;
语句,那将是内存泄漏。
【讨论】:
如果他删除了指针2,那将是未定义的行为。实际上,我不知道会导致内存泄漏的单个平台。最有可能的是,你会得到类似 segfault/AV 的东西。【参考方案10】:不,您不必删除[] pointer2,因为您还没有为它分配内存!
语句pointer2 = pointer1
使pointer2
指向与pointer1
相同的内存地址,不会为其分配任何额外的内存。
【讨论】:
嗯...pointer2
指向同一个地址aspointer1
,它不指向pointer1
的地址(pointer1
的地址会是&pointer1
。
@Nathan Ernst:对不起,我打错了。已更正【参考方案11】:
这就是你的想法的差距:你没有删除指针——你删除了内存。您只需使用指针来标识要释放的内存块。由于这两个变量指向同一个内存,删除一个就等于删除另一个。换句话说,两者都删除就等于删除其中一个两次——这显然是错误的。
【讨论】:
以上是关于这是内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章
从 python 中的共享库返回的数组 - 这是内存泄漏吗?
这是 std::vector 和 std::shared_ptr 内存泄漏的错误吗?