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

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

我想知道有没有什么方法可以禁止删除指针,如果不可能,为什么要创建它?

最佳答案

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

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

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

关于c++ - 如何声明指针成员禁止删除它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18769900/

相关文章:

c++ - 如何强制函数实现应该是引用输入类型而不是值类型

c - 在内存中动态分配矩阵时的问题

c++ - 如何基于文本文件创建或修改QT窗体(编译后)

c++ - Vulkan 中的描述符集计数歧义

c将指针传递给递归函数

c - 指向 char 的类型指针的内存分配疑问

c - ICMP 指针和校验和

如果类是虚拟继承的,C++ 内部会发生什么?

c++ - 如何从 vector<shared_ptr> 中删除一个元素

C++输出顺序