草庐IT

信道分配

全部标签

c++ - copy-and-swap 习语在 self 分配期间如何工作?

我正在阅读优秀的copy-and-swapidiom问题和答案。但是我没有得到一件事:在self分配的情况下它是如何工作的?例子中提到的对象other不会释放分配给mArray的内存吗?那么,自分配的对象不会以拥有无效指针而告终吗? 最佳答案 ButonethingIamnotgettinghowdoesitworkincaseofselfassignment?让我们看一个简单的例子:classContainer{int*mArray;};//CopyandswapContainer&operator=(Containerconst

c++ - 分配器中的每个对象数据?

什么是“分配器中的每个对象数据”。我似乎无法找到这意味着什么。任何人都对这在C++语言方面的含义有很好的解释或链接?澄清第19.4.2节“C++编程语言(特别版)”pg。第573章“类似地,如果允许分配器完全通用,则允许分配器分配任意类型元素的重新绑定(bind)机制将必须更加精细。因此,假定标准分配器不保存每个对象的数据,标准容器的实现可能会利用这一点。” 最佳答案 每个对象的数据或本地状态是指分配器类中的任何非静态数据成员。问题是目前(在c++03中)不支持具有所谓本地状态的分配器。这通常被认为是当今c++中分配器模型的缺陷。通

c++ - 允许堆分配短期范围内的对象以确保内存碎片的自由

我们在嵌入式系统环境中使用C++,基本上不需要任何类型的动态内存分配(例如Resourcesformemorymanagementinembeddedapplication,我们不这样做的原因)。我们仍然不想没有一些很好的基于C++的特性,例如STL容器和std::string。对于第一个,我们会在初始化时保留一个特定的大小,并且不会让容器超出其容量。对于后者(std::string),我对如何“安全地”使用它们有点怀疑,因为它们有时会在堆上分配内存。不过,我发现在某些情况下,使用std::string(通常还有其他堆分配对象)似乎没问题:我会在堆栈上分配对象本身(在由{}分隔的特定范

c++ - 在现代 64 位系统上,什么会导致内存分配失败?

假设进程中有足够的虚拟内存地址。考虑到64位系统几乎有无限的虚拟地址,如果操作系统内存池中仍有可用的物理内存空间,我们是否可以假设内存分配失败的可能性为零? 最佳答案 这取决于。您可以限制(例如在Linux上使用setrlimit(2))一个进程以避免使用所有资源,并且有很好的理由来设置这样的限制(例如避免错误的程序吃掉所有资源,将一些资源留给其他更重要的进程).因此,一个行为良好的程序应该始终测试内存分配(例如malloc(3)或operatornew两者通常都基于较低级别的系统调用,如mmap(2)...).当然,资源不是无限的

c++ - 你如何删除一个分配了 placement new 的对象

C++中的new运算符有很多面孔,但我对placementnew感兴趣。假设你在一个特定的内存位置分配内存intmemoryPool[poolSize*sizeof(int)];int*p=new(mem)int;//allocatesmemoryinsidethememoryPoolbufferdeletep;//segmentationfault在这种情况下,我如何正确地释放内存?如果我不使用内置类型int,而是使用某个名为myClass的类,会怎样?myClassmemoryPool[poolSize*sizeof(myClass)];myClass*p=new(mem)myCl

c++ - Eigen 库分配矩阵的元素?

我在Eigen库中遇到了以下矩阵分配hereMatrix3fm;m作为无聊方法的替代方法(m(0,0)=1;...等)。我的问题是使用第一种方法需要注意什么?因为我知道任何简化都是有代价的。 最佳答案 在第一种情况下,m(0,0)=1电话operator(Index,Index)和operator=(constScalar&s),这可能相当快。鉴于m调用重载operator和一串重载的逗号operator,(constScalar&s),请参阅此处的代码:http://eigen.tuxfamily.org/dox/CommaIni

C++ 允许我在运行时分配一个数组而不是给出一个错误

我读到数组大小需要在编译时知道。但是,当我这样做时,它编译并运行得很好,没有出现任何错误……这是怎么回事?#includeintmain(){intsize;std::cout>size;inta[size];return0;} 最佳答案 您没有将其编译为严格符合C++,而是usinganextensionborrowedfromC99.使用-Wall-Wextra-pedantic-std=c++14让编译器报错。请记住,符合标准的编译器只需要在遇到标准认为格式错误的构造时输出单个诊断。

c++ - 为堆分配整数值

#includeusingnamespacestd;intmain(){inti=newint;cout当我尝试将inti值分配给堆时,它显示错误:从“int*”到“int”的无效转换当我给int指针赋值时,它会赋值给它。为什么我们不能给堆赋值给int。是的,我知道尽可能避免给堆赋值。我看了很多stackoverflow帖子,每个人都解释了int*p=newint[10];请有人向我解释一下。感谢您的帮助。 最佳答案 newint返回指向int的指针,即int*。将其分配给int是明显的类型不匹配。newT返回的指针指向堆上的一个内

c++ - 复制构造函数为动态分配做了什么

这个问题在这里已经有了答案:WhatisTheRuleofThree?(8个答案)关闭6年前。我很好奇为什么拷贝构造函数对于我自己定义类的动态分配如此重要。我正在实现具有动态分配的低级c字符串类,这是我的类的快速ViewclassString{private:char*buf;boolinBounds(inti){returni>=0&&i我知道strdup()函数的部分并不正确,但我只是在做一些测试。我的问题是如果我没有复制构造函数而我的main()是intmain(){Stringb("abc");Stringa(b);cout编译器会告诉我doublefreeorcorrupti

c++ - 什么是智能指针管理的资源,而它们的内存不是new分配的?

我继续在C++Primer5th中看到与“动态内存”相反的“资源”:Bydefault,apointerusedtoinitializeasmartpointermustpointtodynamicmemorybecause,bydefault,smartpointersusedeletetofreetheassociatedobject.Wecanbindsmartpointerstopointerstootherkindsofresources.However,todoso,wemustsupplyourownoperationtouseinplaceofdelete.Ifyouu