草庐IT

信号分配

全部标签

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

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

C++ 异常和信号处理程序

我正在阅读BjarneStroustrup所著的C++的设计与演化。关于异常处理和异步信号,如下所述:Canexceptionsbeusedtohandlethingslikesignals?AlmostcertainlynotinmostCenvironments.ThetroubleisthatCusesfunctionslikemallocthatarenotre-entrant.Ifaninterruptoccursinthemiddleofmallocandcausesanexception,thereisnowaytopreventtheexceptionhandlerfr

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++ - 在 QML 中接收 C++ 信号

我发出信号,然后在QML中捕获;然而,当我尝试读取附加到信号的参数时,我得到“未定义”。以下是一些代码片段。感谢您提前提供帮助!我的模型.hclassMyModel:publicQObject{Q_OBJECT...signals:voidmySignal(floata,some::enumb)...}我的模型.cpp做一些事情来发出信号(这不是问题,只需emitmySignal(1.0,2.0);)someotherclass.cppvoidSomeOtherClass::setupQML(){...QQuickView*view=newQQuickView();QWidget*co

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