gpt4 book ai didi

c++ - 如何使用 shared_ptr 避免悬挂指针?

转载 作者:行者123 更新时间:2023-11-30 01:02:03 24 4
gpt4 key购买 nike

我有一个类,其对象指针将作为键/数据添加到多个 std::map/std::unordered_map/hash(内部实现)中。为了自动删除对象,我使用了 shared_ptr。

我使用 shared_ptr only 设计了我的类(class)类。

现在我想确保将来没有人这样做:

#include <memory>
#include <string>

class A {
protected:
struct this_is_private;

public:
explicit A(const this_is_private &) {}
A(const this_is_private &, ::std::string, int) {}

template <typename... T>
static ::std::shared_ptr<A> create(T &&...args) {
return ::std::make_shared<A>(this_is_private{0},
::std::forward<T>(args)...);
}

protected:
struct this_is_private {
explicit this_is_private(int) {}
};

A(const A &) = delete;
const A &operator =(const A &) = delete;
};


::std::map<A*, int> m_error;
::std::map<::std::shared_ptr<A>, int> m_ok;

::std::shared_ptr<A> foo()
{
::std::shared_ptr<A> temp = A::create();

A * obj_ptr = temp.get();
m_error.insert(pair<A*, int>(obj_ptr, 10)); //How to make sure no one do this in future
m_ok.insert(pair<::std::shared_ptr<A>, int>(temp,10)); //ok
}

最佳答案

How to avoid dangling pointer with shared_ptr?

完全不存储指向对象的裸指针(既不是引用也不是迭代器),或者确保此类指针的生命周期短于共享指针的生命周期。后者的正确性不如前者的正确性容易证明。

How to make sure no one [store bare pointers] in future

除了完全封装对对象的访问之外,C++ 语言中没有任何功能可以阻止获取对象的地址并存储它。获取地址的程序员始终有责任确保生命周期是 - 并且将来会是 - 他们所期望的。更改对象生命周期的程序员有责任确保没有任何内容依赖于更改后的生命周期。

有编程language s,它们被设计成不允许程序员直接访问对象的地址,从而使此类错误成为不可能。 C++ 不是其中一种语言。

关于c++ - 如何使用 shared_ptr 避免悬挂指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56954823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com