操作员 new 已经有一个主体

operator new already has a body

本文关键字:有一个 主体 new 操作员      更新时间:2023-10-16

我正在尝试实现带有参数的运算符 new 作为全局。如果没有args的新内容被重载,则没有问题,但是我在尝试编译时遇到以下错误

inline void* operator new(size_t, void* p) {
    //...
    return p;
}

c:\bjarne_exercise_6.cpp(14(: 错误 C2084:函数"void *运算符 new(size_t,void *( throw(("已具有主体 C:\Program Files\Microsoft Visual Studio 10.0\VC\includeew(55( : 参见前面的"New"定义

c:\bjarne_exercise_6.cpp(40(: 错误 C2264:"运算符 new":函数定义或声明中出错;未调用函数

我刚刚解决了这个问题,你必须在 #include stdafx.h之前声明这一点不,不是真的。它编译得很好,但仍然没有调用这个函数,而是来自新头文件的版本。之所以如此,是因为放置 new(带有 2 个参数(已经在 new 标头中定义。普通的new(只有1, size_t参数(只在那里声明,所以你仍然可以重载它。因此,如果您想要具有多个参数的特殊新@trion则以下建议的解决方案是合适的。

这种放置形式的 operator new(正如标准所称(已经在全局命名空间的C++程序中定义,您不能自己在那里提供定义。与其他全球operator new不同,这个是不可替代的。

C++ 标准定义了一个放置位置,operator new在头文件<new>中获取额外的void*。它的实现类似于这样:

void* operator new(size_t, void* m)
{
    return m;
}

它通常用于实例化已分配内存上的对象,例如,通过将分配与实例化分开的 STL 容器。因此,如果您根据<new>包含任何标准标头,则放置新位置已经定义。

如果要创建自己的具有不同语义的operator new版本,可以使用虚拟参数来消除情况的歧义:

struct my_new_dummy {} dummy;
void* operator new(size_t, my_new_dummy, void* m);
//...
int mem;
int* ptr = new(dummy, &mem) int;

编辑:您可以重新定义普通operator new但不能重新定义放置new的原因是,前者默认由编译器定义并且可以手动覆盖,而放置new是在标头中定义的,因此会导致与重新定义冲突。

1(您有编译错误,因为无法替换全局级别放置新运算符!参见 c++ 11 标准(在以前的标准中也是如此(。

18.6.1.3 Placement forms [new.delete.placement]
1 These functions are reserved, a C++ program may not define functions that 

替换 标准C++库 (17.6.4(。(3.7.4(的规定不适用于这些保留的安置形式 运算符新建和运算符删除。 void* 运算符 new(std::size_t 大小,void* PTR( noexcept;

所以基本上你可以替换其他全局新运算符(见下文(,但不能替换标准禁止的放置形式!

void* operator new (std::size_t size) throw (std::bad_alloc) 

2(另一方面,您可以编写自己的类级别新运算符,包括类中的放置新运算符,这没关系:

class Test
{
public:
    void* operator new (std::size_t size) throw (std::bad_alloc) {
        return malloc(size);
    }
    void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw() {
        return malloc(size);
    }
    void* operator new (std::size_t size, void* ptr) throw() {
        return malloc(size);
    }
};

是的。这种放置形式的operator new已在全局命名空间中定义,因此您无法自己在其中提供定义。这是不可替代的。

相关文章: