当前位置: 首页 > 知识库问答 >
问题:

在g中,使用std::allocate_shared将无法编译增强池分配器

耿建弼
2023-03-14

编辑:

澄清我的期望结果,因为我没有很好地沟通它:
能够使用std::allocate_sharedboost::fast_pool_allocator作为使用g 4.8或更高版本和boost 1.56.0的分配方法。目前这在g 4.6上有效,在4.7、4.8和4.9上失败。

需要明确的是,我不希望为g 4.7做这项工作。

产生错误的测试代码:

#include "boost/pool/pool.hpp"
#include "boost/pool/pool_alloc.hpp"

#include <memory>

int main(int argc, char** argv)
{
  auto fails = std::allocate_shared<int>( boost::fast_pool_allocator<int>() );

  auto works = std::allocate_shared<int>(boost::fast_pool_allocator<int>(), 5);
}

在我们的代码库中,我们使用了d::allocate_shared与提升池分配器相结合,这导致了一些严重的编译错误。然而,这在不同版本的g中发生了变化:
详细信息:64bit,(4.7,4.8)-std=c 11,(4.6)-std=c 0x,boops 1.56.0
4.6-编译愉快
4.7-使编译器崩溃

内部编译器错误:重新输入错误报告例程。请提交完整的错误报告,如果合适,请附上预处理的源代码。请参阅说明。预处理的源代码存储在 /tmp/cca0Emq9.out文件中,请将其附加到您的bugreport中。

4.8 - 令人讨厌的编译错误

/XXXXXXXXXX/boost/boost/pool/pool_alloc.hpp:399:

错误:使用已删除的函数d::_Sp_counted_ptr_inplace,(__gnu_cxx::_Lock_policy)2u

/usr/include/c/4.8/bits/shared _ ptr _ base . h:198:错误:' std::_Sp_counted_base

/usr/include/c/4.8/bits/shared _ ptr _ base . h:379:错误:使用了已删除的函数' std::_Sp_counted_base

/usr/include/c/4.8/bits/shared _ ptr _ base . h:198:错误:声明了here _ Sp _ counted _ base(_ Sp _ counted _ base const

4.9 -严重的编译错误(略有不同)

/XXXXXXXXXXX/提升/提升/池/pool_alloc.hpp:399: 错误: 使用已删除的函数 “标准::_Sp_counted_ptr_inplace, (__gnu_cxx::_Lock_policy)2u

/usr/include/c/4.9/bits/shared_ptr_base。h: 203:错误:'标准::_Sp_counted_base

/usr/include/c /4.9/bits/shared_ptr_base.h:494:错误:在此上下文中类_Sp_counted_ptr_inplace最终:公共_Sp_counted_base

/usr/include/c /4.9/bits/shared_ptr_base.h: 494:错误:使用已删除的函数d::_Sp_counted_base

我花了大量的时间试图弄清这一点,如果有人更熟悉这些组件的内部工作原理,我将不胜感激。


共有2个答案

瞿健
2023-03-14

既然这看起来是个问题(?)使用libstdc,您可以使用标准库函数的boost等价物,而不是< code > boost::allocate _ shared 。包括<代码>

鲍建业
2023-03-14
匿名用户

我花了很多时间研究不同的编译器版本,假设这是g 4.7崩溃和其他应答者/评论者的评论所暗示的编译器错误。然而,在回顾编译错误并深入研究了一段时间之后,我终于在某种程度上理解了编译错误的原因。

因此,问题确实出在< code > boost::fast _ pool _ allocator 和< code > boost::pool _ allocator 中,回想起来似乎有点明显。问题的基本症结在于,增强分配器构造方法是根据c 98标准分配器规范实现的,并且有一个构造方法,它只接受一个常量

alloc_traits:250-61

template<typename _Tp, typename... _Args>
static typename
    enable_if<__construct_helper<_Tp, _Args...>::value, void>::type
    _S_construct(_Alloc& __a, _Tp* __p, _Args&&... __args)
{ __a.construct(__p, std::forward<_Args>(__args)...); }

template<typename _Tp, typename... _Args>
static typename
enable_if<__and_<__not_<__construct_helper<_Tp, _Args...>>,
         is_constructible<_Tp, _Args...>>::value, void>::type
    _S_construct(_Alloc&, _Tp* __p, _Args&&... __args)
{ ::new((void*)__p) _Tp(std::forward<_Args>(__args)...); }

这是我有足够的时间来确定编译错误的来源,但这足以让我找到一个简单有效的解决方案。

这里的解决方案很简单;boost需要更新以使用新的c11分配器规范;在pool_alloc中。hpp替换以下所有实例:

void construct(const pointer ptr, const value_type & t)
{ new (ptr) T(t); }

template <typename... Args>
void construct(const pointer ptr, Args&&... args)
{
  new (ptr) T( std::forward<Args>(args)... );
}

看起来这是一个bug,助推没有更新他们的代码以支持c 11,但是g 5.0(我已经确认了)编译没有问题,这意味着添加这种支持不是强制性的。可能是std::allocate_shared旨在向后兼容旧的分配器接口,4.7、4.8和4.9上的崩溃和编译错误是因为支持被破坏了。我会在助推错误跟踪器上发布一张票,看看他们认为这笔交易是什么:助推trac票

 类似资料:
  • 我试图在IBM Rational应用开发人员版本:9.5.0.2的市场上安装增强的类反编译器插件。但是低于例外, 请在这个问题上帮助我。

  • 我试图用std::pmr::monotonic\u buffer\u资源创建共享指针,但我无法使其编译。我错过了什么? https://godbolt.org/z/R9jdju

  • 我在代码的不同地方使用< code>std::bind时遇到了很多问题。有时行得通,有时行不通,所以我认为我正在做一些根本错误的事情。 据我所知,的以下基本用法应该可以正常使用: 当然< code>bar_auto的类型是< code>std::function 它类似于这个bug,但是它太老了,我不认为它是相关的。 gcc的输出并不特别有启发性: 在文件中包含从bindnew.cpp: 1:0:

  • 我有一个函数定义为 (是映射到英特尔MIC体系结构上SIMD寄存器的本机数据类型) 由于这个函数相当短并且经常被调用,我希望它在每次调用时都内联。但是英特尔的编译器似乎不愿意内联这个函数,即使在我使用 - 和 选项之后也是如此。它报告说“Forceinline不被授予呼叫......”编译时。由于我必须使用一些编译器特定的功能,例如类型,英特尔编译器是我唯一的选择。 更多信息: 文件结构非常简单。

  • 问题内容: 我是Cuda的新手,我正在尝试编译以下简单文件: 使用这个: 我得到的输出是: 我的gcc –version: 如何在不弄乱所有内容的情况下安装4.6和gcc的第二个版本? 答案是: CUDA不支持gcc 4.5和4.6-无法编译代码,并且其他工具链(包括cuda-gdb)将无法正常工作。您不能使用它们,并且该限制是不可协商的。 您唯一的解决方案是安装gcc 4.4版本作为第二个编译器

  • 问题内容: 调试时,我会收到一条警告消息,说明异常-我如何设置在netbeans中使用-g进行编译? 谢谢 问题答案: 据我所知,您 自己的 代码是用调试信息编译的。但是,Java运行时库 不是 。 请仔细检查您看到此消息的位置是否在您自己的代码中,而不是在运行时库中。