用c++类模拟指针(包括delete)
Emulate pointer (including delete) with C++ class
在一个更大的开源项目中,我们在某个地方遇到了悬浮指针的问题。多态对象的实例通过指向它的指针传递,并存储在几个地方。更具体地说:一个产品作为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()
。
- 运算符C++ "delete []"仅删除 2 个前值
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 为什么 cmake 许可证<>样式不包括?
- 计算平均值,不包括上次得分
- 从多个源构造一个对象,包括一个对象向量
- g++用户定义的动态链接库上的全局new和delete运算符
- 为什么"delete"关键字不删除节点?
- 在编译中包括 Botan 2
- "delete"在 C++ 中实际上做了什么?
- 析构函数和'delete'之间的区别
- 将值从另一个数组写入数组,不包括不需要的值 C++
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- 包括C++头文件
- CPP 包括 Azure DevOps 中的目录设置
- 如何知道何时调用删除以及何时调用 delete[] C++?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 包括STL,而不会乱扔全球范围
- 如何反转我的输入,包括否定
- 用c++类模拟指针(包括delete)