C++ 内存管理:从弱指针到自定义分配器
1. 弱指针(Weak Pointer)
弱所有权(Weak ownership)不会使对象保持存活状态。只有当其他对象拥有该对象时,我们才能使用它。使用弱指针的一个常见原因是打破引用循环(reference cycle)。引用循环发生在两个或多个对象使用共享指针相互引用时。即使所有外部的std::shared_ptr构造函数都已释放,这些对象仍会因相互引用而保持存活。
为什么不直接使用原始指针呢?弱指针和原始指针有什么区别吗?实际上,弱指针使用起来更安全,因为只有当对象实际存在时,我们才能引用它,而悬空的原始指针则不具备这种特性。以下是一个示例代码:
auto i = std::make_shared<int>(10); auto weak_i = std::weak_ptr<int>{i}; // Maybe i.reset() happens here so that the int is deleted... if (auto shared_i = weak_i.lock()) { // We managed to convert our weak pointer to a shared pointer std::cout << *shared_i << '\n'; } else { std::cout << "weak_i has expired, shared_ptr was nullptr\n"; }当我们