C++中的new()和delete()是什么操作符?

3

为什么在C++中实现new()和delete()作为操作符?将其作为操作符而不是函数有哪些优点?

使用new()和delete()作为操作符可以使代码更加简洁易读。它们可以像其他运算符一样用于创建和销毁对象,而不需要调用函数。此外,使用操作符还可以方便地进行重载,以满足特定的需求。


操作符的工作方式和函数完全相同。 - Bartek Banachewicz
通常,这样做是为了提供自己的内存管理。 - Branko Dimitrijevic
使其在一定程度上可定制,允许您通过跟踪已分配的内存来最小化链接列表的分配等操作。 - daniel gratzer
5
将其作为运算符的优势与什么替代方案相比较? - Steve Jessop
1
你的意思是什么?例如,sizeof也是一个操作符。你会问同样的问题吗?“sizeof作为操作符的用途或原因是什么?”那“'+' 作为操作符的用途或原因是什么?”你考虑的替代方案是什么? - bames53
显示剩余2条评论
2个回答

7
new 操作符不能作为一个函数,因为它接受类型作为参数。你不能将 new foo_type 写成函数调用,因为 foo_type 不是一个产生值的表达式,而是一个类型名。 delete 操作符可以是针对不同指针类型重载的函数,并且还有一个额外的可选的 bool 参数来表示 delete [] 语义。为什么会有 delete 操作符可能是为了对称于其 new 对应符。
虽然如此,模板函数可以采用类型作为模板参数。但是,newdelete 操作符比模板更早。
此外,可以编写一个函数,该函数以类型的原型实例而不是类型本身作为参数,从中构建一个对象:newobj(m_class(constructor_arg))。这个 newobj 针对不同的类型进行了重载。它分配空间,复制并构造对象,并返回该对象。
因此,最终设计反映了设计者的口味和幻想。
在语言设计中,操作符、函数(以及语句、声明等)之间的分离本身并非必要。

2
你不能将new foo_type写成函数调用,因为那不是有效的函数调用语法(即使参数是值而不是类型也一样)。然而,你可以轻松地像这样调用函数: new<foo_type>()。唯一的问题在于,在模板引入之前,new操作符已经被引入了。如果模板先被引入了,我可以很容易地想象new被定义为一个模板函数。 - sepp2k
2
更具体地说,拥有类型参数意味着您可以在整个应用程序中有选择地覆盖new的功能。您无法使用malloc执行相同的操作;相反,您需要编写一个新的分配器函数,然后修改代码块以使用它。 - Rook
3
@sepp2k 可能不是这样,因为除了类型外,new 还可以采用初始化器。在可变参数模板出现之前,这是不可能的,即使是带有完美转发的可变参数模板也不能完全替代它。 - bames53
1
“你不能将新的foo_type写成函数调用”这句话是为了让理解将某些东西写成函数调用意味着将其转译为适当的语法的人来解释。这并不意味着new foo_type在语法上不是C++函数调用,这是不言自明的。 - Kaz
1
@DavidRodríguez-dribeas 典型情况下,“new运算符”指的是用作运算符的关键字new,而“operator new”则用于引用分配函数。此外,operator new不需要类型... - bames53
显示剩余5条评论

3
我知道有两个常见的原因导致人们覆盖它们。
1)使用new/delete来跟踪对象池。New从池中获取第一个未使用的资源,delete将该资源返回到池中。如果您不断地分配/取消分配对象,则此方法很有用。
2)跟踪内存使用情况。您可以追踪泄漏或内存覆盖问题。例如,您可以在内存的两侧填充内存,或跟踪分配内存的人,以便跟踪未释放内存的人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接