2017-05-09 70 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