2011-03-20 37 views
3

我收到以下錯誤,而編譯自由塞爾納包:錯誤「非放置釋放函數」是什麼?

build/buildd-serna-free_4.3.0.20110221-2-i386-pAsDoD/serna-free-4.3.0.20110221/ 
    sfworks/common/RefCntStorage.h:76:10: 
error: non-placement deallocation function 'static void 
StringPrivate::RefCntData<E>::operator 
delete(void*,StringPrivate::size_type) [with E = QChar, 
StringPrivate::size_type = unsigned int]' 
/build/buildd-serna-free_4.3.0.20110221-2-i386-pAsDoD/serna-free-4.3.0.20110221/ 
    sfworks/common/RefCntStorage.h:135:9: 
error: selected for placement delete 

代碼如下所示:

void operator delete(void* p, size_type) 
{ 
    ::operator delete(p); 
} 
+0

看起來像gcc 4.5中的變化:http://sourceforge.net/tracker/?func=detail&aid=2991134&group_id=119701&atid=684730 – malat 2011-03-20 09:43:59

回答

5

認爲,問題來源於此措詞規範:

如果T類沒有聲明這樣的運營商刪除,但確實聲明一個成員釋放函數命名操作符刪除與正好兩個參數,其中第二個具有類型std :: size_t(18.1),那麼此函數是一個通常的釋放函數

這意味着,如果你試圖聲明對operator newoperator delete是採取了size_t作爲第二個參數,編譯器會認爲你operator delete與此簽名:

void operator delete (void* memory, size_t arg) 

是標準的(非配置)釋放器,而不是應該與operator new(void*, size_t)匹配的放置釋放器。

這有什麼奇怪的是,在spec中沒有地方說它會導致編譯器錯誤。事實上,該規範只是說,如果你有這個錯誤,那麼如果自定義new引發異常,那麼內存不會被清理。如果有人知道爲什麼g++報告這是一個錯誤,我想知道爲什麼(特別是,如果我錯了,這真的應該是非法的)。

編輯:啊!這個問題似乎來自C++ 0x。根據最近的新標準的草案,§ 3.5.4/20:

如果查找發現通常的釋放函數(3.7.4.2)和該函數的兩參數形式,視爲放置取消分配功能,將被選作分配功能的匹配,該程序是不合格的。

它具體列出了這樣做是什麼會導致破損的例子。這在C++ 0x中是新的事實將解釋爲什麼錯誤僅在g++的最新版本中出現。

1

它看起來像類是缺少一個參數不放置delete操作符。

http://oorexx.svn.sourceforge.net/viewvc/oorexx/main/trunk/interpreter/memory/RexxMemory.hpp?r1=6219&r2=6218&pathrev=6219

,並在錯誤報告的詳細信息:

http://sourceforge.net/tracker/?func=detail&aid=2991134&group_id=119701&atid=684730

C++ PATCH的C++/34158(模板 位置刪除)

正如上看到
  • 來自:Jason Merrill
  • 要:GCC-補丁列表
  • 日期:星期二,2009年11月10日13時31分17秒-0500
  • 主題:C++補丁C++/34158(模板位置刪除)

  • /*「如果查找找到一個通常 解除分配

  • 功能(3.7.4.2)和該函數的兩參數形式,視爲放置
  • 釋放函數,將已被選擇爲匹配該
  • 分配功能,該程序不合格。「 */
  • 如果(non_placement_deallocation_fn_p(FN))
  • {
  • 錯誤( 「非配置解除分配函數%q + d」,FN);
  • 錯誤(「選擇用於放置刪除」);
  • }