了解 RAII 对象

Understanding RAII object

我正在阅读 RAII 原则,对此有一些疑问。实际上,它封装了资源。所以,考虑 class std::string。它有一个 constructor string (const char* s);. So, like smart pointers (e.g. template explicit shared_ptr (U* p);) 它需要一个指向资源的指针然后管理它。关于 string 的说法是否正确?

like smart pointers (e.g. shared_ptr) it takes a pointer to the resource and then manages it. Is it correct

不完全是。 shared_ptrs 参与了该指针指向的对象的所有权,而 unique_ptr 获得了独占所有权。在智能指针中,weak_ptr 不会立即取得所有权,但它会作为 shared_ptr 拥有的对象的观察者加入,并允许稍后尝试共享所有权。

要点是那些智能指针拥有由给定的指针指示的现有对象的所有权。

std::string(const char*),另一方面, 复制 指针指向的以 NUL 结尾的字符串,然后它拥有独占所有权。构造函数的指针参数指向的原始文本与构造的 string 对象没有持续相关性;例如,对 string 的修改不会影响该文本。另外,std::string 对象可能会在内部保存一个指向动态分配缓冲区的指针,该缓冲区存储 文本的副本,并且该缓冲区可以调整大小和更新(其他时候 - 为了充分短文本 - 它可以作为优化直接存储在 std::string 对象中)。在销毁时,std::stringdelete[] 它仍在管理的任何内部指针。他们从不泄漏内存。