Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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++中实现我自己的一个新版本,它使用分配器。我可以通过以下方式做到这一点: template <class T> void *operator new(std::size_t size, project::specialized_allocator<T> &a) { return a.allocate(size); }_C++_Clang - Fatal编程技术网

专门新 我想在C++中实现我自己的一个新版本,它使用分配器。我可以通过以下方式做到这一点: template <class T> void *operator new(std::size_t size, project::specialized_allocator<T> &a) { return a.allocate(size); }

专门新 我想在C++中实现我自己的一个新版本,它使用分配器。我可以通过以下方式做到这一点: template <class T> void *operator new(std::size_t size, project::specialized_allocator<T> &a) { return a.allocate(size); },c++,clang,C++,Clang,Clang没有抱怨,而是编译代码。我不确定这应该做什么&为什么它没有用类型错误编译失败。nullptr不是一个project::专用的\u分配器& 我也有类似的怪癖: int *i = new (i) int; 那怎么行?为什么这些示例没有进行类型检查?现有的运算符将void*或std:nothrow\t作为其第二个参数 第一个用于在现有内存地址分配对象。这就是为什么new nullptr和new i compile都可以转换为void* 第二个是告诉标准分配返回空指针,而不是在分配失败时抛出

Clang没有抱怨,而是编译代码。我不确定这应该做什么&为什么它没有用类型错误编译失败。nullptr不是一个project::专用的\u分配器&

我也有类似的怪癖:

int *i = new (i) int;
那怎么行?为什么这些示例没有进行类型检查?

现有的运算符将void*或std:nothrow\t作为其第二个参数

第一个用于在现有内存地址分配对象。这就是为什么new nullptr和new i compile都可以转换为void*

第二个是告诉标准分配返回空指针,而不是在分配失败时抛出std::bad_alloc异常


您可以定义其他参数,但必须确保您传递的任何参数都可以转换为参数类型,并且不能转换为void*或std::nothrow\t,否则将调用标准运算符而不是自定义运算符。

调用您使用的语法,并且new的参数应该是指针。Placement new实际上并不分配任何内容;它只是在指定的位置构造一个对象


当您编写新的nullptr时,您告诉它在地址0处构造一个对象,而newi在从未初始化指针获取的地址处构造它。这两种方法都会导致运行时出现未定义的行为,因为它们涉及取消对空指针和未初始化指针的引用。

我不确定这是否正确。当在类中发现操作符new时,它是否应该考虑其他任何东西?让我检查一下。啊,所以我被转换成了一个空*。谢谢。我不是在类中实现运算符new,而是在顶级实现的。@oconnor0:好的,然后尝试将它放在类中。请注意,您可以在中继承它。@cheers-sandhth.-Alf:这假设X从T继承。我不想有这个要求。如果new的参数应该是指针,则不是。这样说会更好吗?web上的placement new的大多数示例都是将指针作为位置传递,operator new的标准重载仅支持传递void*。第二个参数可以是std::nothrow\t或用户定义的。我从未见过在实际代码中使用用户定义的参数,但我见过并自己使用了nothrow版本。我并不认为nothrow重载是放置,尽管它使用相同的语法。分配函数可以有任意数量的参数>1。因此,短语第二个参数意味着一个不存在的限制。C++标准对分配函数的声明提出以下要求,无论是全局成员还是类成员:返回类型应该是无效的*。第一个参数的类型应为std::size\u t。第一个参数不应该有一个关联的默认参数。在我看来,与运算符new混淆是错误的。标准库采取了正确的方法,允许为各种构造容器、智能指针分配程序,这是明智的。无论如何,您不应该在代码中使用new。
int *i = new (nullptr) int;
int *i = new (i) int;