使用C ++类模拟指针(包括删除)

时间:2015-10-26 18:34:18

标签: c++ pointers delete-operator

在一个更大的OpenSource项目中,我们遇到了悬挂指针的问题。多态对象的实例通过指向它的指针传递并存储在几个地方。更具体地说:一个商品作为Ware*传递,该Ware*在一个点被分配,然后在例如中注册。订购它的建筑物和目前拥有它的承运人(以及几个地方)“所有者”是物理上“拥有”它的地方(例如承运人)。因此,当载体死亡时,他告诉商品告诉建筑物订购它不再出现 - >构建删除其指针。然后删除ware,没有实例应该指向它。

这适用于大多数情况,但似乎存在一些失败并且实例仍有指针的情况。我想检测这个。所以我考虑将WarePtr替换为类delete,它类似于共享指针(引用计数)。因此,当refCount==1被调用时,它可以检查Ware*并断言它。

问题:对于大多数用途而言,它是替代品。除了替换WarePtr - > delete ware之外,语法也发生了变化。但是我还需要更改我希望避免的delete ware来电,这样就可以将其删除,而无需更改此内容。

是否可以创建一个类或重载,以便我可以实际调用WarePtr ware定义为delete? 被调用的函数需要检查断言并在包含的指针上调用delete operator。重载WarePtr*只允许我拦截删除{{1}} ...

的来电

2 个答案:

答案 0 :(得分:4)

如果WarePtr具有Ware*的非显式转化功能,那么您可以在delete上致电WarePtr

  

如果操作数具有类类型,则通过调用上述方法将操作数转换为指针类型   转换函数,转换后的操作数用于代替剩余的原始操作数   这部分。

([expr.delete / 2)

除此之外,操作数必须是一个指针。

答案 1 :(得分:0)

我理解

  

在释放模式下检测到没有开销的约束违规

我仍然建议您切换到shared_ptr,这是正确的做法。普通指针的开销非常小,非常值得获益。

然后,您可以在析构函数中测试约束违规(或者删除您发出的指针的位置),如下所示:

  • 创建一个弱指针。
  • reset()持有您的对象以删除它的共享指针。
  • assert()弱指针为expired()