我正在阅读RAII
原则并对此有一些疑问。实际上,它封装了资源。所以,考虑班级std::string
。它有一个constructor string (const char* s);
。因此,像智能指针(例如template explicit shared_ptr (U* p);)一样,它会获取指向资源的指针,然后对其进行管理。关于string
的说法是否正确?
答案 0 :(得分:4)
像智能指针(例如shared_ptr
)一样,它接受指向资源的指针,然后对其进行管理。这是正确的
不完全。 shared_ptr
参与该指针指向的对象的所有权,而unique_ptr
获得独占所有权。在智能指针中,weak_ptr
不会立即获得所有权,但它会作为shared_ptr
所拥有的对象的观察者加入,并允许稍后尝试共享所有权。
关键是这些智能指针取得了由指针指示的现有对象的所有权。
另一方面, std::string(const char*)
制作指针指向的NUL终止字符串的副本,然后它具有独占所有权。构造函数的指针参数指向的原始文本与构造的string
对象没有持续的相关性;例如,对string
的修改不会影响该文本。另外,std::string
对象可以在内部保留一个指向动态分配的缓冲区的指针,该缓冲区存储文本的副本,并且可以调整缓冲区的大小和更新(其他时间 - 对于足够短的文本 - 它可以作为优化直接存储在std::string
对象中。在销毁时,std::string
将delete[]
它仍在管理的任何内部指针。他们永远不会泄漏记忆。