gpt4 book ai didi

c++ - 如何检查指针后面的对象是否有效或已被删除?

转载 作者:搜寻专家 更新时间:2023-10-30 23:51:14 25 4
gpt4 key购买 nike

我有两个管理类 ManagerAManagerB。它们都包含一个 std::vector 指针,指向某些对象。问题是来自 ManagerA 的指针可以像来自 ManagerB 的指针一样指向同一个对象 obj。现在,如果我从 ManagerA 的 vector 中删除 obj,程序就会崩溃,因为 ManagerB 试图访问对象 obj 现在无效了。

class ManagerA
{
public:
std::vector<Object*> listA;
}

class ManagerB
{
public:
std::vector<Object*> listB;
}

int main()
{
ManagerA* A = new ManagerA();
ManagerB* B = new ManagerB();
Object* O = new Object();

A->listA.push_back(O);
B->listB.push_back(O);

delete A.listA[0];
B->listB[0]->doStuff(); // will crash here! How to avoid?

retrun 0;
}

我怎样才能避免这种情况?有没有办法检查 ManagerBlistB 中指针寻址的对象现在无效?

最佳答案

Is there a way to check in ManagerB, that the object, that is adressed by a pointer in listB is now invalid?

没有。

How can I avoid this?

您需要以某种方式跟踪对象的有效性/存在性。

有很多方法和设计模式可以实现这一点,具体取决于您的需要。

如果您想要一个通用的解决方案,您可以使用共享所有权,例如以引用计数指针的形式,即跟踪有多少人指向该对象的指针,例如 std::shared_ptr在标准库中。这将基本上为您提供从其他语言使用垃圾收集器获得的东西。

但是请注意,除非您确定没有其他更好的选择,否则共享所有权通常是一种代码味道。

关于c++ - 如何检查指针后面的对象是否有效或已被删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57235771/

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