C++中“::delete”的目的是什么?
What is the purpose of "::delete" in C++?
我目前正在查看使用 ::delete
删除指针的 C++ 代码。
一个无意义的例子是:
void DoWork(ExampleClass* ptr)
{
::delete ptr;
}
这样使用delete关键字的目的是什么?
::delete
与 delete
同义
::
用于范围。例如 Classname::
表示 class' 范围内的任何内容。在这种情况下,::
表示默认范围内的任何内容(例如,您不需要为其包含名称空间的任何内容)
delete 从堆中释放一个指针。不这样做将意味着当程序退出时,该内存块仍被计为 OS 使用(OS 通常会清理它,但不释放指针是不好的做法)
通常
int* intpointer = new int(5);
//do something with intpointer
delete intpointer
这是使用 the delete
expression,但带有可选的 ::
前缀。
Syntax
::
(optional) delete
expression (1)
...
Destroys object(s) previously allocated by the new
expression and
releases obtained memory area.
使用::
前缀会影响查找:
The deallocation function's name is looked up in the scope of the
dynamic type of the object pointed to by expression, which means
class-specific deallocation functions, if present, are found before
the global ones.
If ::
is present in the delete expression, only the global namespace is examined by this lookup.
在某些情况下,operator delete
might be redefined -actually overloaded- (for example, your Class
might define it and also define operator new
). By coding ::delete
you say that you are using the standard, "predefined", deletion 运算符。
在某些 Class
中重新定义 operator new
和 operator delete
的典型用例:您想保留由 您创建的所有指针的隐藏全局集 Class::operator new
并被 你的 Class::operator delete
删除。但是 delete
的实现会在调用全局 ::delete
之前从全局集合中删除该指针
delete
在 C++ 中是一个运算符,其方式与 =
相同。因此它可以被重新实现。就像 =
一样,重新实现特定于它所指的 class 。添加 ::
可确保我们调用的 delete
运算符是全局运算符,而不是特定于给定 class 的运算符。
当您为特定的 class 重新实现 delete
然后想引用 真实的 时,这会很有用。
使用 ::delete
在大型程序中有很多用途,在您的示例中它没有多大意义,但在更大的上下文中使用它确实可以实现以下目的:
- 全局变量访问,所以如果你有本地和全局 x。使用
::x
是指全局而不是本地
- 在 class 之外定义一个函数,不确定您为什么想要或需要这样做,但功能是存在的
- 访问静态 class 变量
- 在多重继承的情况下区分两个或多个class之间的相同变量名
下面的 link 有很好的解释和示例供您仔细考虑。
来源:https://www.geeksforgeeks.org/scope-resolution-operator-in-c/
Class-specific overloads
Deallocation functions (17-24) may be defined as static member functions of a class. These deallocation functions, if provided, are
called by delete-expressions when deleting objects (17,19,21) and
arrays (18,20,22) of this class, unless the delete expression used the
form ::delete which bypasses class-scope lookup. The keyword static is
optional for these function declarations: whether the keyword is used
or not, the deallocation function is always a static member function.
这意味着 ::delete
不等于 delete
。这里的区别是 delete
可以被覆盖并且特定于您的 object/class。 ::delete
是全局的
我知道有些情况下你不应该使用“::delete”,它不会起作用
基本上,在释放时,编译器查找的析构函数是全局的最局部的 - 如果在当前作用域中没有找到析构函数,它会查找上一级直到它到达全局(始终存在) ).使用 ::
,将编译器使用的起始范围更改为全局范围。
查看更多here。有一整节。
有可能是您的 class 超载了 new
和 delete
。
所以 ::delete
表示我们指的是全局范围,而不是当前 class.
中被覆盖的那些
有用link:What are "::operator new" and "::operator delete"?
我目前正在查看使用 ::delete
删除指针的 C++ 代码。
一个无意义的例子是:
void DoWork(ExampleClass* ptr)
{
::delete ptr;
}
这样使用delete关键字的目的是什么?
::delete
与 delete
同义
::
用于范围。例如 Classname::
表示 class' 范围内的任何内容。在这种情况下,::
表示默认范围内的任何内容(例如,您不需要为其包含名称空间的任何内容)
delete 从堆中释放一个指针。不这样做将意味着当程序退出时,该内存块仍被计为 OS 使用(OS 通常会清理它,但不释放指针是不好的做法)
通常
int* intpointer = new int(5);
//do something with intpointer
delete intpointer
这是使用 the delete
expression,但带有可选的 ::
前缀。
Syntax
::
(optional)delete
expression (1)...
Destroys object(s) previously allocated by the
new
expression and releases obtained memory area.
使用::
前缀会影响查找:
The deallocation function's name is looked up in the scope of the dynamic type of the object pointed to by expression, which means class-specific deallocation functions, if present, are found before the global ones.
If
::
is present in the delete expression, only the global namespace is examined by this lookup.
在某些情况下,operator delete
might be redefined -actually overloaded- (for example, your Class
might define it and also define operator new
). By coding ::delete
you say that you are using the standard, "predefined", deletion 运算符。
在某些 Class
中重新定义 operator new
和 operator delete
的典型用例:您想保留由 您创建的所有指针的隐藏全局集 Class::operator new
并被 你的 Class::operator delete
删除。但是 delete
的实现会在调用全局 ::delete
delete
在 C++ 中是一个运算符,其方式与 =
相同。因此它可以被重新实现。就像 =
一样,重新实现特定于它所指的 class 。添加 ::
可确保我们调用的 delete
运算符是全局运算符,而不是特定于给定 class 的运算符。
当您为特定的 class 重新实现 delete
然后想引用 真实的 时,这会很有用。
使用 ::delete
在大型程序中有很多用途,在您的示例中它没有多大意义,但在更大的上下文中使用它确实可以实现以下目的:
- 全局变量访问,所以如果你有本地和全局 x。使用
::x
是指全局而不是本地 - 在 class 之外定义一个函数,不确定您为什么想要或需要这样做,但功能是存在的
- 访问静态 class 变量
- 在多重继承的情况下区分两个或多个class之间的相同变量名
下面的 link 有很好的解释和示例供您仔细考虑。
来源:https://www.geeksforgeeks.org/scope-resolution-operator-in-c/
Class-specific overloads
Deallocation functions (17-24) may be defined as static member functions of a class. These deallocation functions, if provided, are called by delete-expressions when deleting objects (17,19,21) and arrays (18,20,22) of this class, unless the delete expression used the form ::delete which bypasses class-scope lookup. The keyword static is optional for these function declarations: whether the keyword is used or not, the deallocation function is always a static member function.
这意味着 ::delete
不等于 delete
。这里的区别是 delete
可以被覆盖并且特定于您的 object/class。 ::delete
是全局的
我知道有些情况下你不应该使用“::delete”,它不会起作用
基本上,在释放时,编译器查找的析构函数是全局的最局部的 - 如果在当前作用域中没有找到析构函数,它会查找上一级直到它到达全局(始终存在) ).使用 ::
,将编译器使用的起始范围更改为全局范围。
查看更多here。有一整节。
有可能是您的 class 超载了 new
和 delete
。
所以 ::delete
表示我们指的是全局范围,而不是当前 class.
有用link:What are "::operator new" and "::operator delete"?