c++ - call 'new' 是如何调用自定义放置分配函数的?

标签 c++

调用 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;
}

因此,除了第一个参数(它自动从类型推导)之外的所有参数都应该放在 newtype 之间,并且应该放在 括号中

因此,在您的示例 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/

相关文章:

c++ - 使用 Qt 进行音频信号处理 GUI 开发,如何?

C++ cuda opengl 不渲染 vbo

c++ - 如何在 DirectX 11.1 中部分更新常量缓冲区

c++ - 一维不变一维可变的容器

c++ - 用于查找范围重叠的内存效率更高的算法

c++ - 为什么我的虚拟方法在 C++ 中被跳过?

c++ - 尝试使用非确定性有限状态机 (C++),静态 std::map 是个好主意吗?

c++ - 用于编译原始二进制文件的 Windows 的 C 编译器?

c++ - 在C++中,两次使用equals是什么意思?

c++ - 将 QKeySequence/QKeySequenceEdit 限制为只有一个快捷方式