用c++类模拟指针(包括delete)

Emulate pointer (including delete) with C++ class

本文关键字:包括 delete 指针 c++ 模拟      更新时间:2023-10-16

在一个更大的开源项目中,我们在某个地方遇到了悬浮指针的问题。多态对象的实例通过指向它的指针传递,并存储在几个地方。更具体地说:一个产品作为Ware*在一个点上被分配,然后在例如订购它的建筑物和当前持有它的承运人(以及更多的地方)中注册,"所有者"是物理上"拥有"它的地方(例如承运人)。所以当承运人死亡时,他告诉ware告诉命令它的建筑它将不再出现——>建筑将移除它的指针。然后,该软件将被删除,并且任何实例都不应该有指向它的指针。

这在大多数情况下是有效的,但似乎有一些情况下,这失败了,实例仍然有一个指针。我想检测这个。所以我想用一个类WarePtr取代Ware*,它的行为就像一个共享指针(引用计数)。因此,当delete被调用时,它可以检查,如果refCount==1并断言这一点。

问题:对于大多数用法,它是一个临时替代品。所以语法变化除了替换Ware* -> WarePtr。但是我还需要更改我想避免的delete ware调用,这样就可以在不需要更改的情况下删除它。

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

如果WarePtr具有到Ware*的非显式转换函数,则可以在WarePtr上调用delete

如果操作数具有类类型,则调用上述方法将操作数转换为指针类型的剩余部分,使用转换后的操作数代替原始操作数本小节。

((expr.delete)/2)

操作数必须是指针

我明白了

在释放模式下检测约束违反而不增加开销

我仍然建议你切换到shared_ptr,这是正确的事情。普通指针的开销非常小,值得使用。

然后,可以在析构函数中(或者在删除给出的指针的任何地方)测试是否违反了约束,如下所示:
    创建一个弱指针。
  • reset()保存对象的共享指针,用于删除对象。
  • assert()表示弱指针为expired()