编译无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);
}
答案 0 :(得分:5)
我认为问题来自规范中的这一措辞:
如果类T没有声明这样的操作符删除但是确实使用两个参数声明了一个名为operator delete的成员释放函数,第二个参数的类型为std :: size_t(18.1),则此函数是通常的释放函数
这意味着,如果您尝试声明一对operator new
和operator delete
以size_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://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);
- 错误(“为展示位置删除选择”);
- }