错误“非位置释放功能”是什么?

时间:2011-03-20 09:27:16

标签: c++

编译无serna包时出现以下错误:

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);
}

2 个答案:

答案 0 :(得分:5)

认为问题来自规范中的这一措辞:

  

如果类T没有声明这样的操作符删除但是确实使用两个参数声明了一个名为operator delete的成员释放函数,第二个参数的类型为std :: size_t(18.1),则此函数是通常的释放函数

这意味着,如果您尝试声明一对operator newoperator deletesize_t作为第二个参数,则编译器会认为您的operator delete与这个签名:

void operator delete (void* memory, size_t arg)

是标准(非放置)解除分配器,而不是与operator new(void*, size_t)匹配的放置解除分配器。

这有点奇怪的是,规范中没有任何地方说它会导致编译错误。事实上,规范只是说如果你有这个错误,那么如果自定义new抛出异常,那么内存就不会被清除。如果有人知道为什么g++将此报告为错误,我很想知道原因(尤其是如果我错了,这确实应该是非法的。)

编辑:啊!问题似乎来自C ++ 0x。根据新标准的最新草案,§3.5.4/ 20:

  

如果查找找到通常的释放函数(3.7.4.2)的双参数形式,并且该函数(被视为放置释放函数)将被选择作为分配函数的匹配,则该程序生病了形成。

它特别列出了这样做作为导致破损的原因的一个例子。事实上,这是C ++ 0x中的新功能,这可以解释为什么错误只会在最新版本的g++中弹出。

答案 1 :(得分:1)

看起来该类缺少单个参数非放置删除操作符。可以看出:

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 for c ++ / 34158(模板   展示位置删除)

     
      
  • 来自:Jason Merrill
  •   
  • 收件人:gcc-patches List
  •   
  • 日期:2009年11月10日星期二13:31:17 -0500
  •   
  • 主题:c ++ / 34158的C ++ PATCH(模板放置删除)

  •   
  • / *“如果查找找到通常的双参数形式   解除分配

  •   
  • 功能(3.7.4.2)和该功能,被视为展示位置
  •   
  • 解除分配功能,将被选为
  • 的匹配项   
  • 分配功能,程序格式不正确。“* /
  •   
  • if(non_placement_deallocation_fn_p(fn))
  •   
  • {
  •   
  • 错误(“非展示位置释放函数%q + D”,fn);
  •   
  • 错误(“为展示位置删除选择”);
  •   
  • }
  •