#include <iostream>
#include <boost/shared_ptr.hpp>
class implementation
{
public:
~implementation() { std::cout <<"destroying implementation\n"; }
void do_something() { std::cout << "did something\n"; }
};
void test()
{
boost::shared_ptr<implementation> sp1(new implementation());
std::cout<<"The Sample now has "<<sp1.use_count()<<" references\n";
boost::shared_ptr<implementation> sp2 = sp1;
std::cout<<"The Sample now has "<<sp2.use_count()<<" references\n";
sp1.reset();
std::cout<<"After Reset sp1. The Sample now has "<<sp2.use_count()<<" references\n";
sp2.reset();
std::cout<<"After Reset sp2.\n";
}
int main()
{
test();
}
运行结果不清楚低于:东西在这个shared_ptr的例子
$ ./a.out
The Sample now has 1 references
The Sample now has 2 references
After Reset sp1. The Sample now has 1 references
destroying implementation
After Reset sp2.
请检查上面的代码。我不清楚的第一件事是,下面的句子是什么意思?所以sp1是一个指针?一个函数?或者一个指向函数的指针?和new implementation()
意味着什么? sp1()的参数?
boost::shared_ptr<implementation> sp1(new implementation());
第二个问题是,destroying implementation
给出的sp1.reset()
和sp2.reset()
的结果。但是,如果sp1.reset()
被注释掉,那么结果将是:
$ ./a.out
The Sample now has 1 references
The Sample now has 2 references
After Reset sp1. The Sample now has 2 references
After Reset sp2.
destroying implementation
如果我们只注释掉sp2.reset()
,那么结果将是:
$ ./a.out
The Sample now has 1 references
The Sample now has 2 references
After Reset sp1. The Sample now has 1 references
After Reset sp2.
destroying implementation
所以没有必要同时调用sp1.reset()
和sp2.reset()
释放shared_ptr,我是对不对?
你不需要调用'reset'来释放指针**,你可以使用'reset'来改变智能指针当前指向的内容。您可以将它想象为一个常规指针的赋值运算符。 –
如果你不知道'new x()'做了什么,你需要了解指针。如果你不知道共享指针是什么,你需要了解智能指针。没有简单的答案比实际阅读更有益。 – chris
在试图理解C++'shared_ptr'之前,至少可以想象你应该先学习另一种语言。根据“Python自动执行的操作”或“在语言X中执行相同的操作'try'/ finally'执行相同的操作,这要比从头开始解释它要容易得多。” – abarnert