如何声明指针成员以禁止删除它[重复]

Posted

技术标签:

【中文标题】如何声明指针成员以禁止删除它[重复]【英文标题】:How to declare pointer member to prohibit delete it [duplicate] 【发布时间】:2013-09-17 04:08:18 【问题描述】:

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

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

我想知道有什么方法可以禁止删除指针,如果不可能,为什么要这样做?

【问题讨论】:

既然被标记为C++,我无法抗拒...void foo(Bar&amp; bar)? 你为什么要抗拒?这是正确的答案。 @Chad(舌头在脸颊上)delete &amp;bar ;););) delete 不是实例方法。 如果您不想删除指针,请不要通过指针传递。为了使指向的对象 100% 安全,请按值传递。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

我不确定谁对正确答案投了反对票(也没有评论引导),但你真丢脸。

以上是关于如何声明指针成员以禁止删除它[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何调用成员函数C ++的指针[重复]

C ++:如何声明私有成员对象[重复]

指向整个数组的C ++指针[重复]

如何禁止向BigQuery加载重复的行?

如何正确删除 std::string 数组 [重复]

如何过滤 bigquery 的重复表行数据以删除重复行?