c++ - 了解 RAII 对象

标签 c++ raii

我正在阅读有关 RAII 原理的文章,并且对此有一些疑问。实际上,它封装了资源。因此,考虑类 std::string。它有一个 constructor 字符串(常量字符* s);。因此,就像智能​​指针(例如 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_ptr 参与该指针指向的对象的所有权,而 unique_ptr 则拥有独占所有权。在智能指针中,weak_ptr 不会立即取得所有权,但它会作为 shared_ptr 拥有的对象的观察者加入,并允许稍后尝试共享所有权。

要点在于,这些智能指针拥有由给定的指针指示的现有对象的所有权。

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

关于c++ - 了解 RAII 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32878915/

相关文章:

c++ - 立体声校正 - ROI 有不同的大小

C++ 对象不止一次被销毁

c++ - 返回指向结构的指针,如何自动释放内存?

c++ - 如果我忽略具有 shared_ptr 返回类型的函数的返回值怎么办

c++ - 是否支持 RAII?

c++ - 这是管理 COM 初始化的好方法吗?

C++ 在构造函数中初始化函数指针

c++ - 如何使用 CryptoApi 导入 PKCS#8

c++ - 我坚持用 C++ 填充我的基于数组的 BST

c++ - 为什么我不能转发声明 typedef?