mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-01-28 04:40:30 +08:00
Update item21.md
This commit is contained in:
parent
500389c18b
commit
75e32d7ce3
@ -130,7 +130,7 @@ auto spv = std::make_shared<std::vector<int>>(initList);
|
||||
|
||||
与直接使用`new`相比,`std::make_shared`在大小和速度上的优势源于`std::shared_ptr`的控制块与指向的对象放在同一块内存中。当对象的引用计数降为0,对象被销毁(即析构函数被调用)。但是,因为控制块和对象被放在同一块分配的内存块中,直到控制块的内存也被销毁,对象占用的内存才被释放。
|
||||
|
||||
正如我说,控制块除了引用计数,还包含簿记信息。引用计数追踪有多少`std::shared_ptr`s指向控制块,但控制块还有第二个计数,记录多少个`std::weak_ptr`s指向控制块。第二个引用计数就是*weak count*。(实际上,*weak count*的值不总是等于指向控制块的`std::weak_ptr`的数目,因为库的实现者找到一些方法在*weak count*中添加附加信息,促进更好的代码产生。为了本条款的目的,我们会忽略这一点,假定*weak count*的值等于指向控制块的`std::weak_ptr`的数目。)当一个`std::weak_ptr`检测它是否失效时(见[Item19](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/4.SmartPointers/item19.md)),它会检测指向的控制块中的引用计数(而不是*weak count*)。如果引用计数是0(即对象没有`std::shared_ptr`再指向它,已经被销毁了),`std::weak_ptr`就已经失效。否则就没失效。
|
||||
正如我说,控制块除了引用计数,还包含簿记信息。引用计数追踪有多少`std::shared_ptr`s指向控制块,但控制块还有第二个计数,记录多少个`std::weak_ptr`s指向控制块。第二个引用计数就是*weak count*。(实际上,*weak count*的值不总是等于指向控制块的`std::weak_ptr`的数目,因为库的实现者找到一些方法在*weak count*中添加附加信息,促进更好的代码产生。为了本条款的目的,我们会忽略这一点,假定*weak count*的值等于指向控制块的`std::weak_ptr`的数目。)当一个`std::weak_ptr`检测它是否过期时(见[Item19](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/4.SmartPointers/item19.md)),它会检测指向的控制块中的引用计数(而不是*weak count*)。如果引用计数是0(即对象没有`std::shared_ptr`再指向它,已经被销毁了),`std::weak_ptr`就已经过期。否则就没过期。
|
||||
|
||||
只要`std::weak_ptr`s引用一个控制块(即*weak count*大于零),该控制块必须继续存在。只要控制块存在,包含它的内存就必须保持分配。通过`std::shared_ptr`的`make`函数分配的内存,直到最后一个`std::shared_ptr`和最后一个指向它的`std::weak_ptr`已被销毁,才会释放。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user