操作员 new 已经有一个主体
operator new already has a body
我正在尝试实现带有参数的运算符 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
已在全局命名空间中定义,因此您无法自己在其中提供定义。这是不可替代的。
- 有一个打印语句的函数是一种糟糕的编程实践吗
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 有没有可能有一个只有ADL才能找到的非好友功能
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 在学习数据结构之前对STL有一个了解是好的吗?
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 我的输出中有一个额外的 0,为什么会这样
- 节点是否为空,即使它有一个值?
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- 在 Stream C++ 文本之前有一个额外的换行符
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 将多个原型文件包含在一个项目中会导致protobuf_AssignDescriptorsOnce()已经有一个主体
- 操作员 new 已经有一个主体
- 我所有的函数都有错误 C2084:函数'function'已经有一个主体