C++ 在C+中实施新布局的正确方法+;

C++ 在C+中实施新布局的正确方法+;,c++,memory-management,new-operator,C++,Memory Management,New Operator,我实施了新的安置方式,如下所示: inline void* operator new (std::size_t n, void* ptr) {return ptr;}; ::new (pointer) int(); 我使用的环境没有标准库,因此我需要新的位置。使用此placement new运算符的语法如下所示: inline void* operator new (std::size_t n, void* ptr) {return ptr;}; ::new (pointer) int(

我实施了新的安置方式,如下所示:

inline void* operator new (std::size_t n, void* ptr) {return ptr;};
::new (pointer) int(); 
我使用的环境没有标准库,因此我需要新的位置。使用此placement new运算符的语法如下所示:

inline void* operator new (std::size_t n, void* ptr) {return ptr;};
::new (pointer) int(); 

我为什么需要这个尺寸?我的std::size_t是unsigned int。之所以这样做,是因为没有可用的动态内存分配,我从池中获取所有指针

我想这只是一个评论,但根据梅尔波默恩的建议,这是一个答案

<> > C++标准要求所有重载的<代码>操作符new()/<代码>或<代码>运算符new [](<)/代码>接受<代码> STD::SiZeSt<<代码>作为第一个参数(并且实现将确保所构建的任何内容的大小通过该参数传递)。 新的位置只是相应的
操作符new()
操作符new[]()
的重载。因此,它必须采用这种形式

其原因大概是考虑到任何此类重载函数都可能需要分配内存,在这种情况下,它需要访问大小信息


没有任何东西可以阻止重载版本忽略size参数——这可能解释了为什么标准不允许重载
operator new()
operator new[])没有这个参数。

因为函数是函数应该如何查找。因为C++标准要求所有代码重载<代码>运算符new()/<代码>或<代码>运算符new [](<)>接受一个<代码> STD::sisixt < /Cord>作为第一个参数(并且将通过任何正在构建的大小)。新的位置只是相应的
操作符new()
操作符new[]()
的重载。推理大概是考虑到任何这样的函数需要分配内存的可能性,在这种情况下,它们需要知道内存的大小。没有任何东西可以阻止您的重载版本忽略size参数。@Peter这看起来是一个很好的答案。
inline void*操作符new(std::size\t n,void*ptr){return ptr;}是我的新操作符的实现。编译器给了我一个错误:error:'operator new'将类型'size_t'('unsigned int')作为第一个参数[-fppermissive]。该标准还规定,运算符new(size_t,void*)的放置形式是不可替换的,也许您应该声明重载,例如运算符new(size_t,void*,my_type)并使用以下表达式:
new(ptr,my_type{})int()
。如果您不这样做,请将您的代码与可能产生意外的其他代码链接。