- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
谁能给我解释一下 C++ primer 第 5 版中的这段话:
Terminology: new Expression versus operator new Function
The library functions operator new and operator delete aremisleadingly named. Unlike other operator functions, such as operator=,these functions do not overload the new or delete expressions. In fact, wecannot redefine the behavior of the new and delete expressions.
A new expression always executes by calling an operator new functionto obtain memory and then constructing an object in that memory. A deleteexpression always executes by destroying an object and then calling anoperator delete function to free the memory used by the object.
By providing our own definitions of the operator new and operatordelete functions, we can change how memory is allocated. However, wecannot change this basic meaning of the new and delete operators.
我没有看到 operator new
或 operator delete
与任何其他重载运算符(如赋值运算符 =
)之间的区别。那么“被误导命名”是什么意思呢?我们都知道我们不会重写像 fObj + fObj
这样的表达式,但我们重载了运算符而不是表达式本身。
事实上,我发现这一段本身具有误导性。毕竟我们可以“滥用”任何可重载运算符以及从哪个运算符new
和delete
那么他在这一段中的意思是什么?谢谢!
最佳答案
C++ 中的大多数运算符不受任何显式语义或要求的约束。唯一真正的异常(exception)是 operator new
和 operator delete
,因为它的特殊用途,这就是它所指的。
例如,让我们考虑operator==
。
尽管让此运算符执行某种比较并返回 bool
以指示相等是常规(而且是明智的)——这实际上不是 C++ 语言所要求的。
事实上,实际上完全有可能定义 operator==
来返回一些完全不相关的东西——也许是一个 int
,一个 std::string
,或者像 std::tuple
这样更奇怪的东西。而且,当然,它不需要实际上执行任何比较。
实际上,C++ 中大多数运算符的语义是弱需求的约定,但不是语言。
这与 operator new
和 operator delete
形成对比。 C++ 中的 new
表达式将始终在 operator new
调用返回的指针处开始动态对象的生命周期。这是否是 new (p) T{...}
用于 placement-new 表达式,new T{...}
与 global-new
运算符,或一些 new(args,...) T{...}
用于自定义 operator new
-- 它必须返回某种形式T
开始生命周期的指针。
同样,delete
必须结束该生命周期,并调用operator delete
释放该生命周期的底层存储。这有效地迫使 operator new
和 operator delete
的语义分别执行某种形式的分配机制和某种形式的清理机制。实际上不可能定义 new
和 delete
来做一些奇怪的事情(如 operator==
的情况),因为隐含的行为调用这些运算符只会中断(如果它完全编译的话)。
这就是为什么引用中提到不能重新定义operator new
/operator delete
的行为;基本意义永远是固定的。
关于C++ 入门第 5 版 : operator new and operator delete overloading,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67409792/
我写了这个课: class StaticList { private: int headFree; int headList; int locNe
我目前正在使用 SQL Server Management Studio 2005,我遇到了一些问题,但首先是我的 DB 架构的摘录(重要的): imghack link to the image 我
范围:两个表。创建新顾客时,他们会将一些有关他们的信息存储到第二个表中(这也是使用触发器完成的,它按预期工作)。这是我的表结构和关系的示例。 表 1-> 赞助人 +-----+---------+--
我想知道,在整个程序中,我使用了很多指向 cstrings 的 char* 指针,以及其他指针。我想确保在程序完成后删除所有指针,即使 Visual Studio 和 Code Blocks 都为我做
考虑以下代码: class Foo { Monster* monsters[6]; Foo() { for (int i = 0; i < 6; i++)
关于 this page , 是这么写的 One reason is that the operand of delete need not be an lvalue. Consider: delet
我无法在 DELETE CASCADE ON UPDATE CASCADE 上添加外键约束。 我使用两个简单的表格。 TAB1 有 2 列:ID int(10) unsigned NOT NULL A
你好,有没有办法把它放在一个声明中? DELETE e_worklist where wbs_element = '00000000000000000054TTO'. DELETE e_workli
我有一个表,它是我系统的核心,向我的客户显示的所有结果都存储在那里。它增长得非常快,因此每 3 小时我应该删除早于 X 的记录以提高性能。 仅删除这些记录就足够了,还是应该在删除后运行优化表? 我正在
这个问题在这里已经有了答案: delete vs delete[] operators in C++ (7 个答案) 关闭 9 年前。 做和做有什么区别: int* I = new int[100]
为什么这段代码是错误的?我是否遗漏了有关 delete 和 delete[] 行为的内容? void remove_stopwords(char** strings, int* length) {
当我使用 new [] 申请内存时。最后,我使用 delete 来释放内存(不是 delete[])。会不会造成内存泄漏? 两种类型: 内置类型,如 int、char、double ... 我不确定。
所以在代码审查期间,我的一位同事使用了 double* d = new double[foo]; 然后调用了 delete d。我告诉他们应该将其更改为 delete [] d。他们说编译器不需要基本
范围:两个表。当一个新顾客被创建时,他们将一些关于他们的信息存储到第二个表中(这也是使用触发器完成的,它按预期工作)。这是我的表结构和关系的示例。 表 1-> 赞助人 +-----+---------
C++14 介绍 "sized" versions of operator delete ,即 void operator delete( void* ptr, std::size_t sz ); 和
我正在执行类似的语句 DELETE FROM USER WHERE USER_ID=1; 在 SQLDeveloper 中。 由于用户在许多表中被引用(例如用户有订单、设置等),我们激活了 ON DE
出于某种原因,我找不到我需要的确切答案。我在这里搜索了最后 20 分钟。 我知道这很简单。很简单。但由于某种原因我无法触发触发器.. 我有一个包含两列的表格 dbo.HashTags |__Id_|_
这是我的代码: #include #include #include int main() { setvbuf(stdout, NULL, _IONBF, 0); setvbuf
是否可以在 postgres 中使用单个命令删除所有表中的所有行(不破坏数据库),或者在 postgres 中级联删除? 如果没有,那么我该如何重置我的测试数据库? 最佳答案 is it possib
我想删除一些临时文件的内容,所以我正在开发一个小程序来帮我删除它们。我有这两个代码示例,但我对以下内容感到困惑: 哪个代码示例更好? 第一个示例 code1 删除文件 1 和 2,但第二个示例 cod
我是一名优秀的程序员,十分优秀!