gpt4 book ai didi

c++ - 谁定义了新的运营商?

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:16 24 4
gpt4 key购买 nike

这个程序应该编译吗?

int main(){
double* p = new double[4];
delete[] p;
return 0;
}

(它使用 GCC 7.1.1 编译)

我问这个的原因是,我不确定是谁提供了 operator new 的定义。 .是语言吗?默认是编译器#include荷兰国际集团<new>

为了让这个问题更清楚,我实际上可以定义(覆盖?)运算符 new .

#include<cstdlib> // malloc and size_t
#include<cassert> // assert
void* operator new[](unsigned long int sz){ // what if this is not defined? who provides `new`?
assert(0); // just to check I am calling this function
return std::malloc(sz);
}
int main(){
double* p = new double[4]; // calls the new function above
delete[] p;
return 0;
}

我在这里做什么?

重写 new ?重载 new ?是new的定义编译器的特殊(魔法)? (例如,如果未定义,则使用提供的语言)。#include<new>的作用是什么在这一切中?

最佳答案

这里有一个 new 表达式,它确实调用了 operator new[]

void* operator new[]( std::size_t count );

编译器在每个翻译单元中隐式声明基本的 operator new(这是由标准指定的),参见 cppreference documentation .

The versions (1-4) are implicitly declared in each translation unit even if the < new> header is not included.

在你的第二个代码片段中,你正在重载(技术上你实际上是在替换)operator new(不是覆盖 em>,这仅适用于虚函数),尽管您应该重载 operator new[](请注意,如果您不这样做,则 operator new[] 将回退在 operator new 上,所以从技术上讲我相信你的代码没问题,但为了清楚起见,我只是重载数组版本)。

关于c++ - 谁定义了新的运营商?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45992782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com