如何声明指针成员以禁止删除它

How to declare pointer member to prohibit delete it

本文关键字:成员 禁止 删除 指针 何声明 声明      更新时间:2023-10-16

我想保证我传递给函数的指针不能在这个函数中删除(我的意思是编译器会在处理此类函数时生成错误)。以下是原始情况。

void foo(Bar *bar) { delete bar; }

现在我尝试了一些方法,但没有成功。

void foo(Bar *bar) { delete bar; }
void foo(const Bar * const bar) { delete bar; } { delete bar; }
template <typename T> void foo(const T &t) { delete t; } // calling foo(bar);

我想知道有没有办法禁止删除指针,如果不可能,为什么会制作它?

这是不可能的。您可以尝试删除所有内容。编译器不能抱怨,但在运行时,您可能会获得未定义的行为。请看下面的代码:

int const i=4;
int const* pi = &i;
delete pi;

编译但会导致运行时错误。如您所见,您甚至可以删除指向位于堆栈中的 const 对象的指针。标准允许它(Herb Sutter 对此表示担忧,但我找不到链接),因为析构函数在离开范围时需要清理 const (RAII) 对象。在任何情况下,函数都能够获取参数的地址并对其调用 delete。即使您使用能够销毁这些对象的私有析构函数和友元函数,也无法阻止调用这些函数。我认为你唯一的选择是信任被调用的函数。

1) 如果要声明函数,则通过不删除指针来防止指针被删除。

2)如果要传达函数不会删除它,则通过引用而不是指针传递对象:void foo(Bar& bar);

3)如果你真的想要奖励积分,请使用智能指针类而不是原始指针(例如 shared_ptrunique_ptr等)

推论 3) 如果您不希望其他人删除该对象(即您希望工厂对象执行内存管理),请将析构函数创建为私有,然后任何在该对象上调用delete函数都会导致编译器错误。