#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();
}
运行结果如下:
$ ./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,对吗?
最佳答案
The first thing unclear to me is that what does below sentence mean? So sp1 is a pointer? a function? or a pointer to a function?
sp
是 shared_ptr<implementation>
.如果您不知道这意味着什么,可以查看引用文档和教程。但简短的版本是:它是一个类似于 implementation *
的对象。指针,除了它会自动删除 implementation
对象当你完成它。这就是使它成为“智能指针”的原因。 shared_ptr
是一种特殊类型的智能指针,可以让您复制任意数量的拷贝,并且仅在所有这些拷贝都消失时才删除底层对象。
一种理解方式是,它为您提供了一种不需要垃圾收集器的简单垃圾收集形式。
另一种看待它的方式是作为 Resource Acquisition Is Initialization 的一部分(RAII),C++ 的核心习语之一。
and new implementation() means what? The argument of sp1()?
new implementation()
创建一个新的 implementation
对象,调用其默认构造函数,并返回 implementation *
指针。该指针是 shared_ptr
的参数构造函数。这意味着 sp1
成为指向新 implementation
的智能指针对象,以便在 sp1
时该对象将被销毁和删除,以及后来制作的任何拷贝,都将消失。
The second question is that destroying implementation is given as a result of sp1.reset() and sp2.reset().
实际上,它是sp1
的结果和 sp2
指向新值或被破坏。 reset
做前者,但只是什么也不做,让他们离开范围做后者。这是 RAII 的主要内容。
So it is not necessary to call both sp1.reset() and sp2.reset() to release the shared_ptr, am I right?
没错。您很少想显式调用 reset
. RAII 的全部意义在于您不必手动管理这些事情;您初始化一个对象(如 shared_ptr
)以获取对资源的访问权限,然后让该对象消失以释放访问权限。
在某些情况下它很有用。例如,如果您有一个 shared_ptr
作为对象的成员,并且该对象的持续时间比它拥有的资源长得多,您可以通过调用 reset
提前释放它. (如果您同时将拷贝传递给其他人,则不必担心它会被提前删除——这只是意味着您不再参与保存它。)
关于c++ - 此 shared_ptr 示例中的内容不清楚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14108794/