2

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

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

我想知道是否有某种方式禁止删除指针如果不可能,为什么要这样做?

4

2 回答 2

1

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

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

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

于 2013-09-12T20:18:51.090 回答
0

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

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

3) 如果你真的想要加分,请使用智能指针类而不是原始指针(例如shared_ptr,unique_ptr等)

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

于 2013-09-12T17:08:30.080 回答