草庐IT

bad-alloc

全部标签

c++ - std::allocator 构造/销毁与放置 new/p->~T()

对于我的一个项目,我正在从头开始编写一些STL容器(我有我的理由)。由于我非常接近地模仿STL的功能和接口(interface),所以我会尽最大努力遵守“如果它与标准结构同名,它将尽可能符合标准”的政策。所以,当然我的容器将分配器作为模板参数,这非常好,因为它允许一些自定义分配方案。关于我的问题。std::allocator接口(interface)将内存分配与对象构造分开。同样,它将释放与销毁分开。这是有道理的,因为从哪里获取内存与在C++中正确构造对象或多或少无关。所以有两个构造/释放函数,默认实现如下所示(直接从书中摘录):voidconstruct(pointerp,const

c++ - 为什么 std::allocator::construct 和 std::allocator::destroy 在元素类型上模板化?

std::allocator的construct和destroy成员函数根据要构造的元素的类型进行参数化:templateclassallocator{public:typedefTvalue_type;typedefT*pointer;templatevoidconstruct(U*p,Args&&...args);templatevoiddestroy(U*p);...};这样做的理由是什么?他们为什么不选择value_type*或pointer?好像allocator应该只知道如何构造或销毁T类型的对象. 最佳答案 这与all

c++ - 有限状态机 : Bad design?

有限状态机通常被认为是OOP中的糟糕设计吗?我经常听到这样的话。而且,在我不得不使用它来处理一个非常古老的、未记录的C++片段之后,我倾向于同意。调试起来很痛苦。可读性/可维护性问题如何? 最佳答案 FSM永远不应该被认为是坏的。它们太有用了,但不习惯它们的人通常会认为它们很麻烦。有许多方法可以使用OOP实现其中之一。有些比其他的更丑。您的底层人员将使用switch语句、跳转表甚至“goto”。如果您正在寻找一种更简洁的方法,我建议您使用Boost'sStateChartlibrary,它专为在C++中实现UML状态图而构建。它利用

c++ - 为什么 allocate_shared 和 make_shared 这么慢

我刚刚编写了一个测试程序来找到分配和释放许多由shared_ptr管理的对象的最快方法。我尝试了shared_ptr和new,shared_ptr和pool,make_shared,allocate_shared。让我惊讶的是allocate_shared比shared_ptr和pool慢。我使用发布版本测试vs2017+win10中的代码。发布build设置为默认(/O2)。我还在gcc4.8.5+centos6.2中使用g++-std=c++11-O3对其进行了测试。代码是:#include#include#include#include#include#includeusingn

c++ - Boost 池分配器不会在 g++ 中使用 std::allocate_shared 进行编译

编辑:澄清我想要的结果,因为我没有很好地传达它:能够将std::allocate_shared与boost::fast_pool_allocator一起用作使用g++4.8或更高版本和boost1.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"#includeintmain(intargc,char**argv){autofails=std::allocat

c++ - 什么是 "allocation context"?

我是一名学生,我必须进行有关内存泄漏检测的研究。在许多论文中,他们都在谈论分配背景。我不知道这是什么意思。我找不到任何allocationcontext的定义(或翻译,我来自德国)。举个例子,引用一篇论文(DetectingMemoryLeaksthroughIntrospectiveDynamic使用机器学习的行为建模):Thekeyideabehindusingmachinelearningisthataleakingobjectisdiscerniblebyobservingthelifetimesofothersimilarobjects.Thatis,anobjectcanb

c++ - "single allocation"对 boost::make_shared 意味着什么

在make_shared的boost文档中,它说:Besidesconvenienceandstyle,suchafunctionisalsoexceptionsafeandconsiderablyfasterbecauseitcanuseasingleallocationforboththeobjectanditscorrespondingcontrolblock,eliminatingasignificantportionofshared_ptr'sconstructionoverhead.我不明白“单一分配”的意思,是什么意思? 最佳答案

c++ - gcc 无效版本(最大)错误添加符号 : Bad value

我已经在Linuxx86_x64上成功地构建了几个32位的静态和共享库,现在我试图将它们链接到一个可执行文件中,但我收到以下错误:/usr/bin/ld:foo.so:__moddi3:invalidversion21(max0)foo.so:erroraddingsymbols:Badvaluecollect2:error:ldreturned1exitstatus其中foo.so是我构建的共享库之一。__moddi3函数是libgccIntegerLibraryRoutines的一部分.它的签名是:—RuntimeFunction:long__moddi3(longa,longb)

c++ - 为什么 `polymorphic_allocator` 采用 `memory_resource` 指针而不是引用?

C++17标准说:[mem.poly.allocator.ctor]polymorphic_allocator(memory_resource*r);Requires:risnon-null.Effects:Setsmemory_­rsrctor.Throws:Nothing.[ Note:Thisconstructorprovidesanimplicitconversionfrommemory_­resource*.— endnote ]接受memory_resource*有什么意义?而不是memory_resource&如果“需要”子句提到r必须是非空的?Bloomberg¹风格指

c++ - 构造函数中的网络连接设置 : good or bad?

我正在开发一个类来处理与可能可用或不可用的远程进程的交互;事实上在大多数情况下它不会。如果不是,则该类的对象在生活中没有任何目的,需要消失。是否不那么丑陋:在构造函数中处理连接设置,如果进程不存在则抛出异常。在单独的connect()方法中处理连接设置,如果进程不存在则返回错误代码。在选项1)中,调用代码当然必须将该类的实例化以及处理它的所有其他内容包装在try()block中。在选项2中,它可以简单地检查connect()的返回值,如果失败则返回(销毁对象),但它不太符合RAII,相关地,如果我选择选项1),是抛出一个std::exception类、从中派生我自己的异常类、滚动我自己