2016-01-22 32 views
0

有了智能指针,你是否仍然需要释放/重置它们以确保内存已经被释放?还是可以让他们掉出范围?当你完成这些任务时,你需要告诉智能指针吗?

行为有什么区别 - 涉及释放内存,悬空指针 - 对于类成员智能指针?析构函数是否总是释放这些变量?

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; 
} 
+2

这就像智能指针的整点。另外,'release()'不会做你认为它所做的事情。 –

+1

听起来就像你在考虑高于平均水平的指针。他们是不同的。 –

+0

只要完成,就有一个例外,这可以说是由于智能指针的滥用造成的。如果你有循环依赖,最普通的是A-> B-> A,那么你需要手动中断循环。在这种情况下更好的设计是让一个对象拥有整个周期。 – MSalters

回答

5

,你仍然需要释放/重置它们,以确保内存被释放?

没有

还是确定让他们掉出的范围是什么?

如果析构函数总是释放这些变量?

没有

之一,使得智能指针这么聪明和强大的事情是,你不再需要担心手工管理的内存。

仅供参考,实际std::unique_ptr::release会减轻其责任的智能指针:它返回一个原始指针,您则需要手动管理。

相关问题