【发布时间】:2019-01-26 18:23:07
【问题描述】:
我目前正在查看使用 ::delete 删除指针的 C++ 代码。
一个毫无意义的例子是:
void DoWork(ExampleClass* ptr)
{
::delete ptr;
}
这样使用delete关键字的目的是什么?
【问题讨论】:
标签: c++ delete-operator scope-resolution
我目前正在查看使用 ::delete 删除指针的 C++ 代码。
一个毫无意义的例子是:
void DoWork(ExampleClass* ptr)
{
::delete ptr;
}
这样使用delete关键字的目的是什么?
【问题讨论】:
标签: c++ delete-operator scope-resolution
delete 在 C++ 中是一个运算符,就像 = 一样。因此,它可以重新实现。就像= 一样,重新实现特定于它所引用的类。添加:: 确保我们调用的delete 运算符是全局运算符,而不是特定于给定类的运算符。
当您为特定类重新实现delete 然后想要引用真正的类时,这可能很有用。
【讨论】:
您的班级可能重载了new 和delete。
所以::delete 表示我们指的是全局范围,而不是当前类中被覆盖的范围。
【讨论】:
这是使用the delete expression,但带有可选的:: 前缀。
语法
::(可选)delete表达式(1)...
销毁先前由
new表达式分配的对象和 释放获得的内存区域。
使用::前缀会影响查找:
释放函数的名称在 表达式指向的对象的动态类型,这意味着 特定于类的释放函数(如果存在)在之前找到 全球的。
如果
::出现在删除表达式中,则此查找只检查全局命名空间。
【讨论】:
类特定的重载
释放函数 (17-24) 可以定义为类的静态成员函数。这些释放函数(如果提供)是 删除对象 (17,19,21) 和 此类的数组 (18,20,22),除非删除表达式使用 形式 ::delete 绕过类范围查找。关键字静态是 这些函数声明的可选:是否使用关键字 与否,释放函数始终是静态成员函数。
这意味着::delete 不等于delete。这里的区别是delete 可以被覆盖并且特定于您的对象/类。 ::delete 是全局的
我知道有些情况你不应该使用“::delete”,它不会起作用
基本上,在解除分配时,编译器查看的析构函数对于全局来说是最局部的——如果在当前作用域中没有找到析构函数,它会查找上一层,直到它到达全局(始终存在)。使用::,将编译器使用的起始范围更改为全局范围。
查看更多here。它有一整节。
【讨论】:
在某些情况下,operator delete 可能会被重新定义——实际上是重载的——(例如,您的 Class 可能会定义它并同时定义 operator new)。通过编码::delete,您表示您使用的是标准“预定义”deletion 运算符。
在某些Class 中重新定义operator new 和operator delete 的典型用例:您希望保留由您的 Class::operator new 创建并被删除的所有指针的隐藏全局集你的 Class::operator delete。但是您的 delete 的实现将在调用全局 ::delete 之前从全局集中删除该指针
【讨论】:
ClassName::operator new (size_t)应该调用另一个分配函数::operator new(size_t)而不是使用new-expression。使用 new-expression 将导致构造函数运行多次。在释放函数中使用 delete-expression 同样会引起麻烦。
::operator delete。
在大型程序中使用::delete 有很多用途,在您的示例中它没有多大意义,但在更大的上下文中使用它确实可以实现以下功能:
::x 指的是全局而非本地下面的链接有一个很好的解释和例子来仔细考虑。
来源:https://www.geeksforgeeks.org/scope-resolution-operator-in-c/
【讨论】:
::delete 是 delete 的同义词
:: 用于范围。例如 Classname:: 表示该类范围内的任何内容。在这种情况下,:: 表示默认范围内的任何内容(例如,您不需要为其包含命名空间的任何内容)
delete 从堆中释放一个指针。不这样做意味着当程序退出时,这块内存仍然被操作系统使用(操作系统通常会清理它,但不释放指针是不好的做法)
通常是这样
int* intpointer = new int(5);
//do something with intpointer
delete intpointer
【讨论】: