【发布时间】:2016-01-22 12:25:27
【问题描述】:
使用智能指针,您是否仍需要释放/重置它们以确保释放内存?还是可以让它们超出范围?
类成员智能指针的行为(与释放内存、悬空指针有关)有什么不同吗?析构函数应该总是释放这些变量吗?
class Foo
{
public:
Foo()
{
myUPtr = std::unique_ptr<int>(new int);
mySPtr = std::shared_ptr<int>(new int);
}
~Foo()
{
// Should these smart pointers be released? Or will falling out of scope/deletion release the memory?
myUPtr.release();
mySPtr.reset();
}
private:
std::unique_ptr<int> myUPtr;
std::shared_ptr<int> mySPtr;
};
int main()
{
// When each of the below variables fall out of scope is there any difference in memory release?
Foo f;
std::unique_ptr<Foo> uFoo(new Foo);
std::shared_ptr<Foo> sFoo(new Foo);
std::unique_ptr<int> uPtr(new int);
std::shared_ptr<int> sPtr(new int);
// Will all these smart pointers be released automatically?
// No need to call .release()/.reset() on any member and non-member smart pointers?
return 0;
}
【问题讨论】:
-
这就是智能指针的全部意义所在。此外,
release()并没有像您认为的那样做。 -
听起来你在考虑高于平均水平的指针。他们是不同的。
-
为了完整起见,有一个例外,可以说是由于滥用智能指针造成的。如果你有一个循环依赖,最简单的是 A->B->A,那么你需要手动打破循环。在这种情况下,更好的设计是让一个对象拥有整个周期。
标签: c++ smart-pointers