了解RAII对象

时间:2015-10-01 03:21:38

标签: c++ raii

我正在阅读RAII原则并对此有一些疑问。实际上,它封装了资源。所以,考虑班级std::string。它有一个constructor string (const char* s);。因此,像智能指针(例如template explicit shared_ptr (U* p);)一样,它会获取指向资源的指针,然后对其进行管理。关于string的说法是否正确?

1 个答案:

答案 0 :(得分:4)

  像智能指针(例如shared_ptr)一样,它接受指向资源的指针,然后对其进行管理。这是正确的

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

关键是这些智能指针取得了由指针指示的现有对象的所有权。

另一方面,

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