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

时间:2013-09-12 16:43:13

标签: c++ pointers

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

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);

我想知道是否有某些方法禁止删除指针如果不可能为什么会这样做?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

1)如果要声明该功能,可以通过不删除指针来防止删除指针。

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

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

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