"new"运算符和"new"函数的区别
Difference between "new" operator and "new" function
面试问题:"新"运算符和"新"函数有什么区别?
我回答说没有区别,他们运行相同的代码,但面试官一直问我,因为这是错误的答案。
这是错误的答案吗?还是面试官只是在和我玩游戏?
如果是错误的答案,正确的答案是什么?
我继续说,如果您需要自定义分配,"新"运算符可能会重载,但后来他想知道如何重载它。当然,我没有这个答案,从来没有这个需要,但我告诉他我可以在10分钟内查到它(这在面试中从来都不是正确的答案)。
所以无论如何,在对"新"运算符与"新"函数进行了一些研究之后,没有看到任何真正令人满意的答案,我想我会问一个具体的问题。
new
运算符和operator new
不是一回事。
new
运算符调用 operator new
函数来分配内存,然后根据分配的类型和使用的语法,初始化或调用分配的内存上的构造函数。换句话说,operator new
仅构成new
运算符操作的一部分。
operator new
是 new
运算符为分配内存而调用的函数。有一个可以替换的默认实现operator new
,这与重载不同。 还可以为特定类型实现operator new
以仅处理该类型的对象的分配,或者可以使用 new
运算符的放置新形式重载operator 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&);
当您为operator new
提供替换或重载时,您应该提供相应的operator delete
功能:
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
运算符的放置形式一起使用,您可以添加其他参数(operator new
的 nothrow 版本,operator delete
执行此操作)。
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
delete
运算符没有"放置删除"形式。之所以提供 operator delete
的重载,是因为如果在内存的初始化/构造过程中发生错误(例如,new
运算符在调用operator new
后调用的构造函数),则在重新抛出异常之前调用相应的operator delete
(如果存在)。否则,不会调用operator delete
,并且在引发异常时内存泄漏。
基本上:-功能:"操作员新"
class Example
{ public:
void* operator new( size_t );
}
"新操作员":
Example* eg = new Example();
我继续说,如果需要,"新"运算符可能会重载 自定义分配
你几乎是对的。 new
是运算符的关键字,用于内存分配。
为什么这是运算符?
根据需要,它可以作为全局作用域或类作用域(但不是namespace
作用域!如果它是一个函数,这是不可能的。
区别在于它们的功能。我相信,根据标准,初始分配部分是相同的。也就是说,显式使用语法 new 与运算符 new() 是非常相同的。区别在于使用 new 初始化或构造新对象。还有 3 个不同版本的 ::operator new(),并且还有各种语法可以使用它们(即放置 new)。
没有新功能。我的猜测是,他们希望您说其中一个分配了内存(标准使用分配器函数,函数新运算符和新运算符),另一个使用第一个来分配内存,然后称为构造函数(标准使用新表达式)和 deallocator 函数(又名函数删除运算符或删除 运算符)以释放内存如果构造函数退出异常。
- 'new'和'='与指针的区别
- new和::new有什么区别
- 带"new"的指针和带"&variable"的指针有什么区别
- new _Elem[_Size]() 与 new _Elem[_Size]{} 有什么区别?
- int '*p = new int (5);' 和 'int *p = new int[5];' 有什么区别?
- (类 *对象;)和(object = new class();)之间有什么区别
- 作为参数的"new Foo()"和"&Foo()"之间的区别
- 新的int()和new int []有什么区别
- "char *"和"char * = new char[]"之间的C++区别
- C++ push_back(*new obj()) 和 push_back(obj()))有什么区别?
- "new int[5]"和"malloc(5 * sizeof(int))"之间的C++有什么区别?
- new/delete 和 ::new/::d elete 有什么区别?
- "new"运算符和"new"函数的区别
- "int *a = new int"和"int *a = new int [5]"有什么区别?
- 在分配器中使用new函数和*alloc函数时,它们之间有区别吗
- c++中new操作符与java中new操作符的区别
- 重载运算符 new 和运算符 new[] 在 C++ 中有什么区别?
- 'new()' int和'int *p'有什么区别
- 全局非抛出 ::运算符 new 和 std::malloc 之间的区别
- 直接声明变量和使用关键字new有什么区别