如何声明指针成员以禁止删除它[重复]
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& bar)
?
你为什么要抗拒?这是正确的答案。
@Chad(舌头在脸颊上)delete &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& bar);
3) 如果您真的想要加分,请使用智能指针类而不是原始指针(例如 shared_ptr
、unique_ptr
等)
推论 3) 如果您不希望其他人删除该对象(即您希望工厂对象进行内存管理),请将析构函数创建为私有,然后在该对象上调用 delete
的任何函数将导致编译器错误。
【讨论】:
我不确定谁对正确答案投了反对票(也没有评论引导),但你真丢脸。以上是关于如何声明指针成员以禁止删除它[重复]的主要内容,如果未能解决你的问题,请参考以下文章