草庐IT

dynamic-memory-allocation

全部标签

c++ - strdup 的替代品

我正在为一本书编写一个C++类,其中包含一个名字:classBook{private:char*nm;...........................................};我不允许在此作业中使用std::string。所以这里我使用strdup将参数名称的值复制到构造函数中的nm中:Book::Book(constchar*name,intthickness,intweight):nm(NULL),thck(thickness),wght(weight){if(name)nm=strdup(name);}是否有另一种方法可以在不使用strdup而使用关键字new的情

C++11:memory_order_relaxed 和 memory_order_consume 的区别

我现在正在学习C++11memoryordermodel并想了解memory_order_relaxed和memory_order_consume之间的区别。具体来说,我正在寻找一个无法将memory_order_consume替换为memory_order_relaxed的简单示例。有一个优秀的post它详细阐述了一个简单但非常具有说明性的示例,其中可以应用memory_order_consume。以下是文字复制粘贴。例子:atomicGuard(nullptr);intPayload=0;制作人:Payload=42;Guard.store(&Payload,memory_orde

C++ STL 问题 : allocators

我有一个(可能是愚蠢的)关于C++STL的问题。当我创建一个容器(vector、set、map等)时,它是分配在栈上还是堆上?如果我制作一个集合并放入500万个字符串,我是否需要担心堆栈溢出? 最佳答案 STL类默认从堆中分配其内部缓冲区,尽管这些类也允许自定义分配器,允许用户指定备用位置进行分配-例如共享内存池。 关于C++STL问题:allocators,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

c++ - 在 dynamic_casting 之后删除指针是否安全?

voidfoo(MyClass*myClass){BaseClass*pBaseClass=dynamic_cast(myClass);deletemyClass;//一般来说,dynamic_cast是如何工作的?(它像复制构造函数一样工作吗?) 最佳答案 不,那是不安全的。dynamic_cast只是一种类型转换——原始指针和转换后的指针都指向同一个对象。转换后的指针可能会指向一个稍微不同的地址(如果涉及多重继承),但它仍然指向(in)同一个对象-不会发生对象复制。编辑:我的意思是“不安全”,意思是“在您删除myClass之后,

c++ - 如何在中等规模的项目中诊断 g++ 错误 "cc1plus.exe: out of memory allocating 838860800 bytes"?

这个问题在这里已经有了答案:Running'gcc'onC++sourcefileonLinuxgives"cc1plus:outofmemoryallocating..."errormessage(2个答案)关闭6年前。我正在尝试移植我的C++library使用基本的g++makefile(它在VisualStudio中编译得很好)。我现在尝试编译的部分大约有45000行代码。库本身编译正常,但是当我尝试将它包含到控制台界面应用程序中时,编译器崩溃并显示以下消息,没有其他消息:cc1plus.exe:outofmemoryallocating838860800bytes当我包含项目的

c++ - 构造函数内部 "this"的 dynamic_cast

这个问题与这个问题非常相似Whycan'tIdynamic_cast"sideways"duringmultipleinheritence?,除了强制转换确实有效-只是不在构造函数中。标题:classA{public:virtual~A(){}voidprintA();};classB{public:B();virtual~B(){}voidprintB();private:std::stringmessage_;};classC:publicA,publicB{public:C(){}virtual~C(){}};来源:voidA::printA(){cout(this);if(a)

c++ - C++ 中的 Realloc 等价物

是的,另一个realloc与std::vector的问题。我知道你要说什么,我同意,忘记手动内存分配,只使用std::vector。不幸的是,我的教授禁止我在这项作业中使用STL中的任何内容。是的,我有一个T的动态数组,我需要它可以调整大小,但我不能使用std::vector。我可以回到黑暗时代并使用malloc和family完成所有事情,但如果我可以使用new那就太棒了。我读过很多帖子,每个人都说“不,你不能这样做,使用std::vector”,但它们都是在2011年8月之前发布的,我希望自从C++11出现以来,某些事情可能会有所改变。那么告诉我,我是走运了,还是必须恢复到C风格的内

c++ - 为什么不是 std::string::max_size() == std::string::allocator::max_size()

最近我注意到给定std::strings的情况下以下陈述不正确.s.max_size()==s.get_allocator().max_size();我发现这很有趣,默认情况下std::string将使用std::allocator其理论极限为size_type(-1)(是的,我知道我假设2的补码,但这与实际问题无关)。我知道实际限制会比这少得多。在典型的32位x86系统上,内核将占用2GB(可能是1GB)的地址空间,实际上限要小得多。无论如何,GNUlibstdc++的std::basic_string::max_size()似乎返回相同的值,不管它使用的分配器说什么(类似于1073

C++:即使被转换的对象不是 NULL,dynamic_cast 也会导致 SEGFAULT。怎么会这样?

假设我有一个类A和一个派生自A的类B。现在,我想使用dynamic_cast(见下文)将constA*(称为“a”)转换为B*。如果“a”真的是B*,那么我得到的对象指针应该没问题。如果“a”不是B*,那么我将得到NULL。constA*a=newB();constB*b=dynamic_cast(a);出于某种原因,dynamic_cast操作会导致SEGFAULT。如果“a”不是NULL,那怎么会发生呢?我想如果有任何转换问题,dynamic_cast会给我一个NULL指针,而不是SEGFAULT。如果我试图访问“b”并且动态转换不成功,我应该只得到一个SEGFAULT,对吗?我什

c++ - 避免 std::bad_alloc。 new 应该返回一个 NULL 指针

我将一个中型应用程序从C移植到C++。它不会在任何地方处理异常,这一点不应该改变。我(错误!)对C++的理解是(直到我昨天艰难地学习它)(默认)new运算符在出现分配问题时返回NULL指针。然而,直到1993年(左右)才出现这种情况。现在,它抛出一个std::bad_alloc异常。是否可以在不重写所有内容以在每次调用时使用std::nothrow的情况下返回到旧行为? 最佳答案 你可以重载operatornew:#includevoid*operatornew(size_tpAmount)//throw(std::bad_allo