【问题标题】: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% 安全,请按值传递。

标签: c++ pointers


【解决方案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 的任何函数将导致编译器错误。

    【讨论】:

    • 我不确定谁对正确答案投了反对票(也没有评论引导),但你真丢脸。
    猜你喜欢
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2016-10-03
    相关资源
    最近更新 更多