【发布时间】:2015-12-28 23:54:34
【问题描述】:
我正在阅读有关RAII 原则的内容,对此有一些疑问。实际上,它封装了资源。所以,考虑类std::string。它有一个constructorstring (const char* s);。因此,就像智能指针(例如template explicit shared_ptr (U* p);)一样,它需要一个指向资源的指针,然后对其进行管理。 strings 这样说对吗?
【问题讨论】:
我正在阅读有关RAII 原则的内容,对此有一些疑问。实际上,它封装了资源。所以,考虑类std::string。它有一个constructorstring (const char* s);。因此,就像智能指针(例如template explicit shared_ptr (U* p);)一样,它需要一个指向资源的指针,然后对其进行管理。 strings 这样说对吗?
【问题讨论】:
像智能指针(例如
shared_ptr)一样,它需要一个指向资源的指针,然后对其进行管理。是否正确
不完全是。 shared_ptrs 参与该指针指向的对象的所有权,而 unique_ptr 拥有独占所有权。在智能指针中,weak_ptr 不会立即获得所有权,但它会作为 shared_ptrs 拥有的对象的观察者加入,并允许稍后尝试共享所有权。
关键是这些智能指针获得了它们所给指针所指示的现有对象的所有权。
std::string(const char*),另一方面,复制指针指向的以 NUL 结尾的字符串,然后它拥有该指针的独占所有权。构造函数的指针参数指向的原始文本与构造的string 对象没有持续相关性;例如,对string 的修改不会影响该文本。另外,std::string 对象可能会在内部保留一个指向动态分配缓冲区的指针,该缓冲区存储文本的副本,并且该缓冲区可以调整大小和更新(其他时候 - 对于足够短的文本 - 它可能直接存储在std::string 对象中作为优化)。在销毁时,std::string 将 delete[] 它仍在管理的任何内部指针。它们从不泄漏内存。
【讨论】: