shared_ptr 使用引用计数来确定何时销毁对象。
并请看这段代码:

int main() {
    std::shared_ptr<int> pt = std::make_shared<int>(3);
    int *pt2 = pt.get();
    cout << "reference count " << pt.use_count() << endl;
    pt = 0;
    cout << *pt2;

};

在我将 pt 设置为 0 后,引用计数应该变为 0,并且该对象应该被销毁。但是我仍然可以使用 pt2 来访问它。就我而言,结果是正确的,但我想这只是运气。那么是否意味着如果程序员想做一些愚蠢的事情,引用计数机制仍然无法使其100%安全?

最佳答案



引用计数确实变为零并且对象被销毁了。

int 替换为您自己的类 MyInt 以查看正在调用的构造函数和析构函数...

class MyInt
{
private:
   int val;

public:
   MyInt() : val(0)          { std::cout << "default c'tor called" << std::endl; }
   MyInt(int rhs) : val(rhs) { std::cout << "c'tor (" << rhs << ") called" << std::endl; }
   ~MyInt()                  { std::cout << "d'tor called" << std::endl; }
   int getval (void)         { return val; }
};

...然后更新 main() ...
int main()
{
   std::shared_ptr<MyInt> pt = std::make_shared<MyInt>(3);

   MyInt* pt2 = pt.get();

   std::cout << "reference count " << pt.use_count() << std::endl;

   pt = 0;

   std::cout << pt2->getval() << std::endl;

   return 0;
}

输出将(也许)看起来像这样......



runnable sample

输出的最后一行是值三( 如果 是三)这一事实并不能证明对象没有被删除。

取消引用指向已删除对象的指针是 undefined behaviour,因此任何事情都可能发生。

关于C++ 为什么原始指针不会增加 shared_ptr 的引用计数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51578307/

10-11 22:06
查看更多