2017-05-09 71 views
0

我有一个项目,严格控制什么和如何分配内存。我有一个可以分配在堆上的事物的基类,对于operator newoperator 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 new s返回指针,operator delete s不做任何事情。

当我在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_toperator delete但似乎没有任何工作。什么是静态成员放置的正确形式operator delete

+0

它应该是你所定义的http://en.cppreference.com/w/cpp/memory/new/operator_delete – StoryTeller

+0

我还必须指出,我不能重现你的错误http://rextester.com/OHB53375 – StoryTeller

+0

如果我尝试放置一个对象,它对我很有用,它只是导致警告的派生类。尽管警告的确引用了Object的操作符。 – lcsondes

回答

0

似乎我需要在每个派生类中声明operator delete以摆脱警告。

+0

[不,你没有](http://rextester.com/edit/OHB53375)。只要确保公开继承。 – StoryTeller

+0

我确实继承了公开。这不会是我在这个项目中遇到的第一个编译器错误,例如,在调试版本中执行'ptr->〜DerivedFromObject()'会生成一个对无法访问的'operator delete'进行引用,在发布。 – lcsondes

+1

'ptr->〜DerivedFromObject()'根本不会生成对操作符删除的引用。这只是一个直接的析构函数调用。我的意思不是听起来令人沮丧,但是你的项目可能只是遭受了未定义行为的实例,编译器正拼命地试图警告你。 – StoryTeller