Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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++;17:必须至少更换哪些版本的global operators new/delete以涵盖所有情况?_C++_C++17_New Operator - Fatal编程技术网

C++ c++;17:必须至少更换哪些版本的global operators new/delete以涵盖所有情况?

C++ c++;17:必须至少更换哪些版本的global operators new/delete以涵盖所有情况?,c++,c++17,new-operator,C++,C++17,New Operator,当全局重载运算符new和delete时,需要实现哪些版本以覆盖所有情况 在c++17之前,似乎已经足够实现void*操作符new(size\u t bytes)和void操作符delete(void*ptr),因为默认实现的数组版本和非抛出版本都是使用这两个函数实现的 但是c++17呢?例如,没有提到(4)将通过调用(3)来实现(其中提到(2)将通过调用(1)来实现) 那么,在c++17中,需要替换包含对new和delete版本(具有本地重写的类除外)的所有调用的运算符的最小数目是多少?来自CP

当全局重载运算符new和delete时,需要实现哪些版本以覆盖所有情况

在c++17之前,似乎已经足够实现
void*操作符new(size\u t bytes)
void操作符delete(void*ptr)
,因为默认实现的数组版本和非抛出版本都是使用这两个函数实现的

但是c++17呢?例如,没有提到(4)将通过调用(3)来实现(其中提到(2)将通过调用(1)来实现)

那么,在c++17中,需要替换包含对new和delete版本(具有本地重写的类除外)的所有调用的运算符的最小数目是多少?

来自CPPFREFERENCE(以及类似的注释):

nothrow版本(5-8)的标准库实现直接调用相应的抛出版本(1-4)。抛出数组版本(2,4)的标准库实现直接调用相应的单对象版本(1,3)。因此,替换抛出单对象分配函数就足以处理所有分配

因此,您需要替换这些函数:

void*运算符新(标准::大小\u t计数);
void*运算符new(标准::大小\u t计数,标准::对齐\u值\u t al);
void操作符delete(void*ptr)noexcept;
void操作符delete(void*ptr,std::align_val_t al)无异常;
其余的将在这四个方面实施

如果您没有对齐的malloc等价物来替换对齐的版本,以下是对齐的
新的
/
删除
在非对齐版本方面的一个简单实现:

#包括
#包括
#包括
void*运算符新(标准::大小\u t计数,标准::对齐\u值\u t al){
标准:尺寸对齐=静态铸造(al);
如果(对齐\uu STDCPP\u默认值\u新对齐)[[可能]]{
ptr=*静态铸件(静态铸件(ptr)-尺寸(空隙*);
}
操作员删除(ptr);
}