Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 区别于;新";操作员和;新";功能_C++_Operators - Fatal编程技术网

C++ 区别于;新";操作员和;新";功能

C++ 区别于;新";操作员和;新";功能,c++,operators,C++,Operators,采访问题:新操作员和新功能有什么区别 我回答说并没有区别,他们运行相同的代码,但面试官不断地指责我,认为这是错误的答案 这是错误的答案吗?还是面试官只是在和我玩游戏 如果答案是错误的,那么正确的答案是什么 我继续说,如果您需要自定义分配,“new”操作符可能会过载,但他想知道如何过载。当然,我没有这个答案,因为我从来没有这个需要,但我告诉他我可以在10分钟内找到它(这在面试中从来都不是正确的答案) 因此,不管怎样,在对“新”运算符与“新”函数进行了一些研究之后,没有看到任何真正令人满意的答案,我

采访问题:新操作员和新功能有什么区别

我回答说并没有区别,他们运行相同的代码,但面试官不断地指责我,认为这是错误的答案

这是错误的答案吗?还是面试官只是在和我玩游戏

如果答案是错误的,那么正确的答案是什么

我继续说,如果您需要自定义分配,“new”操作符可能会过载,但他想知道如何过载。当然,我没有这个答案,因为我从来没有这个需要,但我告诉他我可以在10分钟内找到它(这在面试中从来都不是正确的答案)

因此,不管怎样,在对“新”运算符与“新”函数进行了一些研究之后,没有看到任何真正令人满意的答案,我想我应该问一个具体的问题。

基本上:- 功能:“新操作员”

“新操作员”:

我继续说,如果需要,“新”操作符可能会过载 自定义分配

你几乎是对的。
new
是运算符的关键字,用于内存分配

为什么这是一个操作员?

根据需要,它可以在全局范围或类范围(但不是
命名空间
范围!)作为函数重载。如果它是一个函数,这是不可能的。

不同之处在于它们如何工作。根据我认为的标准,最初的分配部分是相同的。也就是说,显式使用语法new vs operator new()是非常相同的。不同之处在于使用新的初始化或构造新对象。还有3个不同版本的::operator new(),还有各种语法可以利用它们(即placement new)。

没有新函数。我猜他们想让你说其中一个分配了内存(标准使用分配器函数、函数new operator和函数new operator),另一个使用第一个分配内存,然后调用构造函数(标准使用新表达式)和deallocator函数(又名函数delete operator或delete operator)在构造函数异常退出时释放内存。

新的
操作符和新的
操作符不是一回事


new
操作符调用
operator new
函数来分配内存,然后根据分配的类型和使用的语法,初始化或调用分配内存上的构造函数。换句话说,
operator new
只构成
new
操作符操作的一部分

operator new
是由
new
操作符调用的分配内存的函数。有一个可以替换的
operator new
的默认实现,这与重载不同。
operator new
也可以实现为只处理该类型对象的分配,或
>运算符new
可以重载,并且可以使用
new
运算符的placement new表单选择重载

operator new
的默认实现可以通过定义具有以下签名的函数来替代:

void *operator new(std::size_t size);
void *operator new(std::size_t size, const std::nothrow_t&);
void *operator new[](std::size_t size);
void *operator new[](std::size_t size, const std::nothrow_t&);
当您为
操作员新建
提供替换或重载时,您应提供相应的
操作员删除
功能:

void operator delete(void* ptr) noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;
void operator delete[](void* ptr) noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;
要提供超负荷的
operator new
以与
new
运算符的放置形式一起使用,您可以添加额外的参数(nothrow版本的
operator new
operator delete
执行此操作)


delete
操作符没有“placement delete”形式。提供了
操作符delete
的重载,因为如果在内存初始化/构造过程中发生错误(例如,在调用
操作符new
之后,
新操作符调用的构造函数)如果在重新抛出异常之前调用相应的<代码>操作符删除< /C>,否则,不调用“代码>操作符删除< /COD>”,当异常被抛出时,

新功能是什么?我从未听说过标准C++中的这种函数(注意我不是C++人).您所指的新函数是否与运算符new相同?这通常就是它的名称,它应该可以帮助您通过谷歌搜索答案。问题可能是new operator和operator new之间的差异。@Heisenbug同意。Q包含了此问题的超清晰定义。
void *operator new(std::size_t size);
void *operator new(std::size_t size, const std::nothrow_t&);
void *operator new[](std::size_t size);
void *operator new[](std::size_t size, const std::nothrow_t&);
void operator delete(void* ptr) noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;
void operator delete[](void* ptr) noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;
struct my_type {};

void *operator new(std::size_t size, const my_type&);
void operator delete(void *ptr, const my_type&);

new (my_type()) int(10); // allocate an int using the operator new that takes a my_type object