【问题标题】:What does the error "non-placement deallocation function"?错误“非放置释放功能”是什么?
【发布时间】:2011-03-20 18:14:36
【问题描述】:

在编译无 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);
}

【问题讨论】:

标签: c++


【解决方案1】:

认为问题出在规范中的这个措辞上:

如果类 T 没有声明这样的 operator delete 但确实声明了一个名为 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++ 中开始出现。

【讨论】:

    【解决方案2】:

    该类似乎缺少单参数非放置删除运算符。如上所示:

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

    • 来自:杰森美林
    • 收件人:gcc 补丁列表
    • 日期:2009 年 11 月 10 日星期二 13:31:17 -0500
    • 主题:C++ PATCH for c++/34158(模板放置删除)

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

    • 函数 (3.7.4.2) 和该函数,被视为放置
    • deallocation 函数,将被选为匹配
    • 分配函数,程序格式错误。" */
    • if (non_placement_deallocation_fn_p (fn))
    • {
    • 错误(“非放置释放函数%q+D”,fn);
    • 错误(“选择用于放置删除”);
    • }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-05
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 2014-01-06
      • 2021-11-09
      相关资源
      最近更新 更多