如何声明指针成员以禁止删除它
How to declare pointer member to prohibit delete it
我想保证我传递给函数的指针不能在这个函数中删除(我的意思是编译器会在处理此类函数时生成错误)。以下是原始情况。
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;
编译但会导致运行时错误。如您所见,您甚至可以删除指向位于堆栈中的 const 对象的指针。标准允许它(Herb Sutter 对此表示担忧,但我找不到链接),因为析构函数在离开范围时需要清理 const (RAII) 对象。在任何情况下,函数都能够获取参数的地址并对其调用 delete。即使您使用能够销毁这些对象的私有析构函数和友元函数,也无法阻止调用这些函数。我认为你唯一的选择是信任被调用的函数。
1) 如果要声明函数,则通过不删除指针来防止指针被删除。
2)如果要传达函数不会删除它,则通过引用而不是指针传递对象:void foo(Bar& bar);
3)如果你真的想要奖励积分,请使用智能指针类而不是原始指针(例如 shared_ptr
、unique_ptr
等)
推论 3) 如果您不希望其他人删除该对象(即您希望工厂对象执行内存管理),请将析构函数创建为私有,然后任何在该对象上调用delete
函数都会导致编译器错误。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 当空基类也是成员变量时,为什么禁止空基优化?
- 警告:ISO C++禁止将静态“constexpr char*”数据成员的字符串常量转换为“char*”
- 错误:ISO C 禁止采用不合格或括号的非静态成员函数的地址,以形成指向成员函数的指针
- 为什么默认成员值禁止使用支持列表初始化
- 为什么ISO C++标准禁止对成员进行初始化
- 错误:ISO C++禁止在类内初始化非 const 静态成员
- 为什么隐式"lambda to function pointer conversion"禁止"by reference"捕获静态成员?
- C++标准是否明确禁止通过 constexpr 成员函数指针调用默认参数?
- C++ :禁止类更改指针成员变量指向的值
- 如何声明指针成员以禁止删除它
- ISO c++禁止在结构体中初始化成员
- 类成员变量的Decltype是否被禁止?为什么
- 禁止在没有用户定义 ctor 的情况下显式复制数据成员
- 如何禁止在c++ 2011中调用右值对象的const成员函数?