【发布时间】:2017-05-09 09:57:58
【问题描述】:
我有一个项目可以严格控制分配内存的内容和方式。我有一个基类,用于可能在堆上分配的东西,operator new 和 operator delete 及其数组变体的静态重载。这些都可以完美运行,完全没有任何警告。
对于所有只允许放置新的东西都有一个终极基类:
class Object
{
public:
static void* operator new(size_t, void*);
static void* operator new[](size_t, void*);
static void operator delete(void*, void*);
static void operator delete[](void*, void*);
};
实现很简单,在相应的 .cpp 文件中。 operator news 返回指针,operator deletes 什么也不做。
当我在 VS2015 下编译时,使用 new (ptr) DerivedFromObject() 会产生以下警告。异常处理设置为/EHa。
warning C4291: 'void *Object::operator new(std::size_t,void *)': no matching operator delete found; memory will not be freed if initialization throws an exception
我试过弄乱签名:添加noexcept,将size_t 添加到operator delete,但似乎没有任何效果。静态成员放置operator delete的正确形式是什么?
【问题讨论】:
-
我还必须指出,我无法重现您的错误rextester.com/OHB53375
-
如果我尝试放置一个对象,它确实对我有用,它只是导致警告的派生类。不过,警告确实指的是 Object 的 operator new。
标签: c++