草庐IT

new_value

全部标签

【C++破局】C++内存管理之new与deleted剖析

​作者主页📚lovewold少个r博客主页  ⚠️本文重点:c++内存管理部分知识点梳理👉【C-C++入门系列专栏】:博客文章专栏传送门😄每日一言:花有重开日,人无再少年!目录C/C++的内存分配机制内存分区1.内核空间(KernelSpace):2.栈空间(Stack):3.内存映射段(MemoryMappingSegment):4.堆(Heap):5.数据段(DataSegment):6.代码段(CodeSegment):C与C++的动态内存管理方法malloc,calloc,realloc的内存开辟函数内存泄露  C++的内存管理方式new/delete操作内置类型 new的基本用法de

c++ - 在C++中,一个线程中的new是否可以分配另一个线程删除的内存?

Inglibc,mallocisimplementedwitharenas.因此,例如,有可能首先由malloc分配的内存及以后free线程A中的d不能被另一个调用malloc使用在线程B中,由于线程A和B可能在不同的arenas,不同的arenas维护着不同的heaps和freelistsofmemory。谈到C++(可能还有C++11,因为C++11有一个新标准),故事还是一样吗?或者不同的线程实际上共享同一个堆段和内存空闲链表,并且new在一个线程中可以先分配内存new编及以后delete由另一个线程d?如果答案取决于实现,那么问题是它们在主要的C++编译器(例如g++、MVC+

c++ - 如果我按值(value)捕获但不使用它,我还能得到一份拷贝吗?

我不想在lambda中按值捕获shared_ptr以确保对象的生命周期延长到调用lambda函数的时间点。否则我实际上不需要shared_ptr。如果我这样做:shared_ptrsp;sp->async_call([sp](){});sp是否保证被复制,即使正文没有引用它? 最佳答案 我会说这是有保证的,因为这句话。5.1.221Whenthelambda-expressionisevaluated,theentitiesthatarecapturedbycopyareusedtodirect-initializeeachcorr

c++ - 延长临时生命周期,适用于 block 范围的聚合,但不能通过 `new` ;为什么?

备注:这个问题最初被问为acomment来自RyanHaining在thisanswer.structA{std::stringconst&ref;};//(1)Aa{"helloworld"};//temporary'slifetimeisextendedtothatof`a`std::cout//(2)A*ptr=newA{"helloworld"};//lifetimeoftemporarynotextended?std::coutref问题为什么临时文件的生命周期在(1)中延长,而在(2)中没有? 最佳答案 LONGSTOR

c++ - '_ITERATOR_DEBUG_LEVEL' : value '0' doesn't match value '2' 检测到不匹配

使用VS2010构建时,我正在构建一个导致许多此类链接错误的库:errorLNK2038:mismatchdetectedfor'_ITERATOR_DEBUG_LEVEL':value'0'doesn'tmatchvalue'2'导致我必须同时发布我的库的发行版和调试版。我没有理由发布lib的调试版本,它只会使二进制分发版膨胀。但是在调试中构建的客户端代码拒绝链接到我的发布库。我以前见过这个问题,但他们似乎没有问正确的问题。我明白这个错误是什么,以及为什么我会得到它(好吧,有点;我不确定到底是什么发出了依赖性。你呢?),但我想知道的是如何消除这种依赖性的发生在我的库中?类似于在使用冲

c++ - `Base *b = new Base;` 与 `Base *b = new Base();` 没有定义我自己的构造函数

如果我不定义自己的构造函数,Base*b=newBase;与Base*b=newBase();之间有什么区别吗? 最佳答案 初始化是标准中要遵循的一种PITA...然而,这两个已经存在的答案在他们遗漏的内容上是不正确的,这使他们确认没有区别。在没有用户定义的构造函数的类中调用newT和newT()之间存在巨大差异。在第一种情况下,对象将被默认初始化,而在第二种情况下,它将被“值初始化*”。如果对象包含任何POD子对象,那么第一个将使POD子对象保持未初始化状态,而第二个会将每个子元素设置为0。structtest{intx;std:

c++ - 调用 placement new 时,将指针强制转换为 "void*"有什么影响吗?

我正在审查自定义容器的代码,它的某些部分创建了如下元素:::new((void*)&buffer[index])CStoredType(other);有些人是这样的:::new(&buffer[index])CStoredType(other);所以两者都使用placementnew来调用复制构造函数来通过复制其他元素来创建元素,但在一种情况下,指向新元素存储的指针按原样传递,而在另一种情况下,它被转换为void*。转换为void*有什么影响吗? 最佳答案 是的,您可以为非空指针重载operatornew。强制转换确保采用void指

c++ - 为什么C++在创建数组时不允许 `new`调用构造函数

假设您正在堆上创建一个对象数组,如下所示:myClass*objectPtr=newmyClass[10];new仅调用默认构造函数,并且(根据我的阅读)不允许调用任何其他构造函数。为什么new不能调用任何其他构造函数背后是否有任何逻辑?做类似的事情似乎更好myClass*objectPtr=newmyClass[10](12);相对于myClass*objectPtr=newmyClass[10];objectPtr[0]=myClass(12);objectPtr[1]=myClass(12);... 最佳答案 WhydoesC

c++ - 使用 const 成员放置 new 和类的赋值

为什么是未定义的行为?structs{constintid;//(引用标准会很好)。这个问题来自thisanswer. 最佳答案 显示的代码片段没有任何内在的UB。但是,几乎可以肯定,在任何正常使用情况下,UB都会立即出现。来自[basic.life]/8(强调我的)If,afterthelifetimeofanobjecthasendedandbeforethestoragewhichtheobjectoccupiedisreusedorreleased,anewobjectiscreatedatthestoragelocatio

c++ - 在 Google 测试失败输出消息中自定义实际/预期的 "Value of"字符串

我从GoogleTest得到以下输出单元测试:UnitTests.cc:56:FailureValueof:LineSegment2i(Vector2i(-10,0),Vector2i(-10,10)).toLine()Actual:24-byteobjectExpected:Line(10,3.14159265358979323846)Whichis:24-byteobject[FAILED]LineSegmentTests.toLine(1ms)那个十六进制输出字符串不是很有用。有什么我可以添加到Line的吗?类(相等性测试失败)在这种情况下提供更多有用的错误?有问题的类已经覆盖了