c++ - 是否有任何指针包装器可以跟踪原始指针是否被删除?
问题描述
我正在与(不是我拥有的)API 进行交互,该 API 需要一个原始指针Thing
,有时会自行删除它,基本上是这样的:
bool foo(Thing* ptr) {
if (/* some condition */) {
delete ptr;
return true;
} else {
return false;
}
}
现在我正在编写一些与此方法交互的测试,并且我希望避免T* ptr = new Thing(); bool res = foo(ptr); /* real test */; if (!res) { delete ptr; };
在代码中编写典型的传播。
所以我创建了某种看起来像这样的“跟踪包装器”:
template <typename T> class Holder {
public:
// Subclass of Z where the dtor will just update Holder's state.
template <typename Z> class Helper : public Z {
public:
Helper(Holder<Z>& holder): holder_{holder} {}
virtual ~Helper() { holder_.markDeleted(); }
private:
Holder<Z>& holder_;
};
~Holder() {
if (!deleted_) { delete ptr; }
}
void markDeleted() { deleted_ = true; }
T* data() { return ptr; }
private:
bool deleted_ = false;
T* ptr = new Helper<T>(*this);
};
所以基本上我可以这样使用它:
Holder<Thing> h;
foo(h.data());
Thing*
如有必要,使用 Holder 的析构函数进行清理。
这个自定义代码有什么替代方法(例如在标准库中)?
我们可以假设如下:
- T 的析构函数是虚拟的,
- T 不需要构造参数,
- 我们不能修改 T。
解决方案
auto h = std::make_unique<T>();
if (foo(h.get())) {
h.release(); // already deleted, so we don't own it
}
(这就是为什么实现不应该标记unique_ptr::release
为[[nodiscard]]
)
推荐阅读
- html - 使用 curl 命令发布文件
- material-ui - 具有特定日期格式的 Material-UI 文本字段
- reactjs - 为什么不允许带有接口的 defaultProps ?在打字稿中标记
- git - ssh_exchange_identification:连接被远程主机 x 关闭
- python - 如何使用 numpy 或 tensorflow 更快地在 N 部分中平均分配图像?
- python - Jupyter:尝试在单个图形上绘制方程式时出现“AttributeError:'零'对象没有属性'名称'”错误
- python - 使用 python win32com 发送 Outlook 电子邮件并标记为后续
- c - 有没有办法在另一个维度上计算 2D FFT 的 1D FFT 而无需使用 intel mkl 进行转置?
- apache - 在 Apache Ant 中转义斜线
- python - 如何将值附加到熊猫数据框中的单元格