我正在做一个游戏引擎,我遇到了一个破坏元素的问题。
例如,我有一些摄像机跟随并观察目标(游戏对象或演员)。在游戏的后期,摄像机目标被破坏,摄像机代码将崩溃,因为代码将尝试访问一个释放的对象,我想避免这种崩溃。
下面是一个简单的代码示例:
我有一个示例化的对象,例如一个int,以保持简单。我有几个关于这个物体的参考资料。如果示例化的对象被删除,如果我的脚本想要访问被销毁的对象,我希望能够检查该对象是否仍然存在。
int* refToMyInt = nullptr; //I want to possibility to have empty pointer
int* refToMyInt2 = nullptr;
int* myInt = new int(2);
refToMyInt = myInt;
refToMyInt2 = refToMyInt;
delete myInt;
if(refToMyInt == nullptr && refToMyInt2 == nullptr)
std::cout << "myInt Deleted!" << std::endl; // Never called
除了不起作用之外,delete似乎并没有将变量更改为nullptr
。
我不想手动将refToMyInt
和refToMyInt2
设置为nullptr,因为我可能有几十个对该对象的引用。
我已经找到了一个解决方案,但它是使用weak_ptr
,我想避免使用它,因为每次使用lock()
函数访问值有点麻烦和不切实际...
有别的解决办法吗?谢谢你!
2条答案
按热度按时间kokeuurv1#
**“我想避免使用它,因为每次使用lock()函数访问值有点麻烦和不切实际。
对于
*(ptr.lock())
与*ptr
,这可能是正确的,但这是一个错误的比较。在解引用ptr
之前,您应该始终检查ptr
是否是nullptr
:这只是稍微比以下内容更详细:
回答:
解决方案是
std::shared_ptr
和std::weak_ptr
的组合。而不是:
你可以写:
我保留了原始的变量名,以便于比较。
l5tcr1uw2#
下面的例子将向您展示vector/make_unique的更多用途。