c++ - 带有 smart_ptr 和 weak_ptr 的循环缓冲区?

标签 c++ c++11

我找不到一个完整的例子来说明如何消除 shared_ptr 之间的强循环引用。

问题是如何使用 weak_ptr 来“关闭”通用元素链并使用 weak_ptr 访问“下一个”元素。

谢谢。

编辑:

例如,假设有 Element e1, e2, e3;,其中包含指向下一个元素的指针。 在 C 中我们做

e1->Next = e2;
e2->Next = e3;
e3->Next = e1;

...我们可以做 e1->Next->Next->Next->Next->Next 等等

在使用 shared_ptr 的 C++ 中,我们不能执行最后的 ->Next = e1,因为循环引用和析构函数不会释放所有 Element .

我们需要一个 weak_ptr :但是什么策略可以得到相同的结果呢?

最佳答案

好的,我找到了解决方案。

当我需要从链的last 访问到first 元素(对象、结构或typedef_data)时,只需使用weak_prt使用 lock() (也许使用 expired() 来检查 poiter 是否仍然存在...)

例子:

 std::weak_ptr<int> gw;

void f()
{
    if (auto spt = gw.lock()) { // Has to be copied into a shared_ptr before usage
    std::cout << *spt << "\n";
}
else {
        std::cout << "gw is expired\n";
    }
}

int main() {

{ //into the scope
    auto sp = std::make_shared<int>(42);
    gw = sp;

    f();
}
 // out of the scope
f();
}

因此,输出将是:

42
gw is expired

expired()在本例中没有使用,但应该在lock()lock()的返回值之前使用< strong>必须始终选中。

关于c++ - 带有 smart_ptr 和 weak_ptr 的循环缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39211218/

相关文章:

c++ - std::result_of 用于内置运算符

c++ - 如何将动态加载的文件存储为类成员 - 指针,非指针成员, vector ?

c++ - 为什么人们使用诸如 char*&buf 之类的东西?

c++ - 如何询问年龄并将其他所有内容设置为无效?

c++ - 错误 : no matching function for call to ‘_3DVec::_3DVec()’

c++ - 如何构造具有唯一指针的 vector

C++11 类属性作为另一个对象?

c++ - 跨模块共享内存对象

c++ - 如果我从 C++ 中的嵌套映射/集合中删除一个元素,是否会出现内存泄漏?

c++ - 如何初始化我在头文件中定义的 vector ?