草庐IT

信道分配

全部标签

c++ - 如何检测 C++ 中未分配内存的双重删除或删除?

我正在编写全局delete/new运算符的调试版本来检测内存泄漏、双重删除和未分配内存上的删除。就"new"运算符而言,我覆盖了全局新运算符并使用宏传递了文件名和行号信息。覆盖的“new”运算符将内存地址、文件名、大小和行号信息存储在以地址为键的映射中。我也覆盖了“删除”运算符,它从map中删除了已删除地址的条目。现在我想将删除的内存信息存储在另一个映射中,该映射存储调用“删除”的位置的文件名和行号信息。但是删除运算符只接受参数(要删除的对象的内存地址)。有人能告诉我如何检测代码中的双重删除吗? 最佳答案 您已经在重载的new中创建

c++ - delete[] 运算符是否处理通过指针返回的动态分配的内存?

我想知道delete[]运算符如何处理函数返回的指针,而不是在与delete语句相同的范围内进行动态分配。假设我有一个像这样的简单函数:int*getArray(){int*returnVal=newint[3];returnVal[0]=returnVal[1]=returnVal[2]=0;returnreturnVal;}现在,当我需要在代码中使用该数组时,我会执行以下操作:int*vals=getArray();//usevalues...delete[]vals;但是,我想知道,C++编译器如何知道分配的内存块有多大(以及要从vals中删除多少内存元素)?这是一种有效的技术,

c++ - 在堆上分配异常有什么陷阱吗?

问题说明了一切:在堆上分配异常有什么陷阱吗?我问是因为在堆上分配异常,结合polymorphicexceptionidiom,解决线程之间传输异常的问题(为了讨论方便,假设我不能使用exception_ptr)。或者至少我认为它确实...我的一些想法:异常处理程序必须捕获异常并知道如何删除它。这可以通过使用适当的删除器实际抛出auto_ptr来解决。还有其他方法可以跨线程传输异常吗? 最佳答案 Arethereanypitfallswithallocatingexceptionsontheheap?一个明显的陷阱是堆分配可能会失败。

c++ - 如何区分使用内存池分配的类

在一个项目中,我有两种类:类型A:我使用std::unique_ptr管理的正常分配类B类:new被重写以从boostmemorypool分配内存的类对于后者,正确的用法是像往常一样调用new来分配一个新实例,但永远不要调用delete。当内存池对象用完时,这些对象会被清理干净范围。因此,如果我不小心将B类实例存储在std::unique_ptr中,我会得到一个段错误。同样,对B类指针显式调用delete也不是一个好主意。我应该使用什么样的C++机制来防止这些类型的错误发生?作为一个简单但丑陋的修复方法,我正在考虑重命名我所有的B类类,使其具有像MP这样的前缀(用于内存池),所以我直观

c++ - 找到巨大的已分配内存块

我有一个用c/c++编写的程序(守护进程)。它运行完美,但在一段时间后(可能是5天、一周、2周),它会分配大量内存。我不明白代码的哪些部分没有释放分配的内存。启动时内存使用量约为20-30兆字节。然后在一段时间后,或者可能发生事件后,它会以每小时1Mb的速度缓慢增长,如果不终止,可能会因为没有可用内存而崩溃。我已经尝试使用Valgrind并在它已经分配了大约500Mb的内存时以通常的方式关闭了守护进程。关机过程真的很长,但是当它结束时,Valgrind说没有发现内存泄漏,除了mysql_init/mysql_close程序(大约504字节肯定丢失)。Google表示无需担心此Mysql

c++ - 清理堆分配对象的良好做法或约定?

我正在学习C++。我有C、C#、ObjC背景。相当高级的语言。在C#或ObjC上,作为函数或方法的结果返回堆分配对象是微不足道的。因为对象的清理是受管理的(按照惯例)。它将在适当的时候销毁。但我不知道我应该如何在C++中处理它。例如,std::string*makeString(){std::string*str=GetSomeStringFromArbitrarySource();SaveSomewhereElseInternally(str);returnstr;}voiduseString(){std::string*str=makeString();//Whereandhows

c++ - 如何使用参数化构造函数动态分配对象数组?

这个问题在这里已经有了答案:C++:dynamicallyallocatingamemberarrayofstructsusingnon-defaultconstructor(4个答案)关闭9年前。考虑一个简单的类:classSimpleClass{inta;public:SimpleClass():a(0){}SimpleClass(intn):a(n){}//otherfunctions};SimpleClass*p1,*p2;p1=newSimpleClass[5];p2=newSimpleClass(3);在这种情况下,调用默认构造函数SimpleClass()来为p1构造新分

c++ - GNU 编译器 vs. Visual Studio 在数组上分配 w/Length Constant w/in a Scope

我知道如果你在c/c++中设置一个动态值,你不能在括号内使用该值来分配一个数组(这会使它成为所谓的可变长度数组(VLA),其中currentC++standard不支持)...即见:C++:VariableLengthArrayhttp://en.wikipedia.org/wiki/Variable-length_array我不太明白(而且我在这里没有看到确切地问到的)是为什么GNUc/c++编译器(gcc、g++)没问题使用基于整数值的动态分配(据我所知),只要该值是数组分配范围内的常量,但VisualStudio不支持这一点并且将拒绝编译代码,吐出错误。例如在g++中voidFo

使用 "new"的 C++ 动态内存分配

我是C++的新手,正在尝试自学(我有Java背景)。有动态内存分配的概念,我可以使用new分配给一个数组(例如)。在C(以及C++)中,我有malloc和realloc正在执行此操作。在C++中,出于某种我无法理解的原因,他们添加了new。我已经阅读了很多有关进入堆栈的普通数组与进入堆的动态分配数组之间的区别的文章。所以我的理解是,通过使用new我在堆中分配空间,当完成一个函数时不会自动删除,但会保留在原处直到我最后,手动释放它。我找不到在普通内存上使用动态内存分配的实际例子。据说我在使用普通数组时无法通过运行时分配内存。好吧,可能我没有理解正确,因为当我尝试创建一个普通数组(没有ne

c++ - 在 C++ 中为变量分配作用域

看看这段代码,有人能解释一下为什么a+1;被分配给b吗?#includeintmain(intargc,char*argv[]){inta=5;intb=({std::cout 最佳答案 结构intb=({std::cout...不是标准的C++,而是g++编译器提供的语言扩展。它叫做“statementexpression”,本质上允许您为计算引入局部变量。由于您不使用它,您可以只使用标准C++“commaexpression”像这样:intb=(std::cout在这两种情况下,序列中的表达式都是按顺序求值的,表达式的整体值是最