在一个更大的OpenSource项目中,我们遇到了悬挂指针的问题。多态对象的实例通过指向它的指针传递并存储在几个地方。更具体地说:一个商品作为Ware*
传递,该Ware*
在一个点被分配,然后在例如中注册。订购它的建筑物和目前拥有它的承运人(以及几个地方)“所有者”是物理上“拥有”它的地方(例如承运人)。因此,当载体死亡时,他告诉商品告诉建筑物订购它不再出现 - >构建删除其指针。然后删除ware,没有实例应该指向它。
这适用于大多数情况,但似乎存在一些失败并且实例仍有指针的情况。我想检测这个。所以我考虑将WarePtr
替换为类delete
,它类似于共享指针(引用计数)。因此,当refCount==1
被调用时,它可以检查Ware*
并断言它。
问题:对于大多数用途而言,它是替代品。除了替换WarePtr
- > delete ware
之外,语法也发生了变化。但是我还需要更改我希望避免的delete ware
来电,这样就可以将其删除,而无需更改此内容。
是否可以创建一个类或重载,以便我可以实际调用WarePtr ware
定义为delete
?
被调用的函数需要检查断言并在包含的指针上调用delete operator
。重载WarePtr*
只允许我拦截删除{{1}} ...
答案 0 :(得分:4)
如果WarePtr
具有Ware*
的非显式转化功能,那么您可以在delete
上致电WarePtr
。
如果操作数具有类类型,则通过调用上述方法将操作数转换为指针类型 转换函数,转换后的操作数用于代替剩余的原始操作数 这部分。
([expr.delete / 2)
除此之外,操作数必须是一个指针。
答案 1 :(得分:0)
我理解
在释放模式下检测到没有开销的约束违规
我仍然建议您切换到shared_ptr
,这是正确的做法。普通指针的开销非常小,非常值得获益。
然后,您可以在析构函数中测试约束违规(或者删除您发出的指针的位置),如下所示:
reset()
持有您的对象以删除它的共享指针。assert()
弱指针为expired()
。