调用 int *a = new(__FILE__, __LINE__) int;
可以调用函数 void* operator new(size_t , const char *, unsigned int );
.
它是如何工作的?
最佳答案
C++ 中的每个运算符都有特定的语法和语义要求,即使在重载之后也必须遵守这些要求。例如。即使您重载插入符号 ^
运算符来表示 power
,您也不能期望它具有比乘法 *
更高的优先级,它将是代数中的案例。
new
运算符的语法要求如下。
new (arguments ... /*for specialized case*/) Type (initializer list);
new (arguments ... /*for specialized case*/) Type [size_t];
因此,为了能够使用 void* operator new ( std::size_t count, void* ptr );
必须编写以下代码。
int main()
{
char arr[sizeof(int)];
int *a = new(arr) int;
}
虽然 void* operator new ( std::size_t count );
可以被调用而不会出现任何故障。
int main()
{
int *a = new int;
}
因此,除了第一个参数(它自动从类型推导)之外的所有参数都应该放在 new
和 type
之间,并且应该放在 括号中
。
因此,在您的示例 int *a = new(__FILE__, __LINE__) int;
中,new 的语法规则寻找 operator new(std::size_t 计数, char const *, int)
关于c++ - call 'new' 是如何调用自定义放置分配函数的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40144788/