【发布时间】:2015-12-15 15:59:27
【问题描述】:
我想说明一件我看到的事情:
class Something {};
void do_something(const Something *p_sth) {}
然后:
do_something(new Something());
应该会导致内存泄漏,因为当您调用 new 时,您也应该始终调用 delete,对吗?这会是一个好的解决方案吗?
void do_something(const Something *p_sth)
{
delete p_sth;
}
还是使用引用&更好?我还发现智能指针可以解决这个问题,所以不需要 delete (这似乎是一件好事,但我以前从未使用过它)。我只想知道最好的解决方案是什么,以避免内存泄漏。谢谢
*谢谢大家的回答。它帮助我清理了一些事情。我也很抱歉我发布的代码可能过于笼统。
【问题讨论】:
-
“应该导致内存泄漏......”如果不知道
do_something对其参数做了什么,就无法判断。换句话说,除非函数文档说明你应该这样做,否则不要new参数。 -
您已经提到了许多可能的解决方案。 '正确'的取决于特定的应用程序(你想在哪里使用它?它会与继承一起使用吗?等等......)
-
使用智能指针更好,但是是的,你写的不会导致内存泄漏,因为函数会清理它。您只能在无法获取 nullptr 作为值时使用引用...所以这取决于情况
-
附注:如果你使用智能指针,你不应该调用也不应该新建或删除,你可以使用 make_unique 和 make_shared
-
在现代 C++ 中,您实际上需要指针的情况很少(当您不能使用引用时的多态性就是其中之一)。 C++11 中引入的新智能指针应该更多地从资源所有权的角度来看待,而不是简单的自动删除指针。
标签: c++ pointers memory-leaks