2011-03-20 72 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);
  • 错误(“选择用于放置删除”);
  • }