C++ c++;17:必须至少更换哪些版本的global operators new/delete以涵盖所有情况?
当全局重载运算符new和delete时,需要实现哪些版本以覆盖所有情况 在c++17之前,似乎已经足够实现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
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);
}