草庐IT

双重性

全部标签

c++ - 双重删除数据不会崩溃

我正在尝试学习C++,并且正在编写程序来学习复制构造函数和运算符重载。我很惊讶下面的程序在使用Copy构造函数时不会崩溃并提示“DoubleFree”,而在使用Operator=重载时会持续崩溃。#includeusingnamespacestd;classXHandler{public:XHandler(){data=newchar[8];strcpy(data,"NoName");}XHandler(constchar*str){data=newchar(strlen(str)+1);strcpy(data,str);}XHandler(constXHandler&xh){data

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

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

尝试捕获语句将字符串变成VB中的双重

我有以下功能,应该检查给定的条目是否高于0.0DiminputstrAsString=.Item("conc")TryDimconcentrationAsDouble=CDbl(inputstr)CatchexAsExceptionDimconcentrationAsDouble=-1.0FinallyDimconcentrationAsDouble=-1.0EndTryIfconcentration>0.0Thenerr=1EndIf但是,我不断获得“没有宣布集中度”。由于其保护水平,它可能无法访问。有任何想法吗?谢谢看答案可变范围变量Concentration仅存在于尝试块中。因此,每当您

c++ - C++ vtables中的双重间接

我编写了这个非常简单的C++程序,我想知道为什么编译器将vtable布局为跨越两个指针取消引用。这是C++程序:classFoo{public:virtualvoidbar(){}};intmain(intargc,char*arv[]){Foofoo;Foo*foo_p(&foo);foo_p->bar();}现在,我可以查看编译器生成的程序集:$g++-ggdb-Wall-O0-Stest.cpp以下是相关部分:.loc190leaq-16(%rbp),%rax#puttheaddressof'foo'in%raxmovq%rax,%rdi#useitasthefirstargum

c++ - 使用复制构造函数后双重释放子对象

我无法弄清楚为什么(看起来)一个对象被破坏了两次。如果我创建一个类(B)的对象,其中包含另一个类(A)的对象,并且我复制该对象。复制的对象被破坏两次。虽然它看起来像这样。我无法弄清楚这个输出。我创建了以下(至少?)示例,它似乎触发了我的问题:#include#includetemplateclassA{public:A(){myCtr=++ctr;printf("classAdefaultConstructor-objectid:%u\n",myCtr);}A(constA&a2){myCtr=++ctr;printf("classAcopyconstructor-objectid:%

c++ - 我很难修复我认为是双重免费的东西

我正在尝试创建一个链表vector作为类成员。Valgrind显示没有内存泄漏,但也会在程序结束时产生Invalidfree()/delete/delete[]/realloc()错误。我试图通过为链表编写析构函数、复制构造函数和复制赋值运算符来解决这个问题。我相信这些已经正确实现。我还尝试了各种向成员vector添加链表的方法(引用、指针、智能指针),但似乎都无法解决问题。#include"lists.h"lists::lists(){}voidlists::newList(){intsize,value;cout>size;shared_ptrnew_list(newlist);/

c++ - 共享指针双重删除

我有一个对象,尽管它被智能指针跟踪,但显然被双重删除了。我不熟悉使用智能指针,所以我创建了一个简单的函数来测试我是否正确使用了该对象。int*a=newint(2);std::shared_ptrb(a);std::shared_ptrc(a);当指针超出范围时,主函数中的这组代码会导致运行时错误,为什么?智能指针不是应该能够自己处理a的删除吗? 最佳答案 shared_ptr期望拥有指向的对象。您所做的是创建两个独立的智能指针,每个智能指针都认为它拥有底层int的独占所有权。他们不知道彼此的存在,他们不互相交谈。因此,当它们超出范

构成导致不兼容的指针类型。为什么只选择双重指针?

这个问题已经解决这里.建议复制当前给出的答案并没有解决为什么首先给出的示例没有问题。主要为什么不理理由:"constint**isapointertoconstint*这与仅仅是不同的事情int*"也申请:"constint*isapointertoconstint这与仅仅是不同的事情int"我正在从不同的角度接近它,希望得到另一个解释。带有示例的代码。#includevoidf_a(intconsta){/**Can'tdo:*a=3;//error:assignmentofread-onlyparameter‘a’**Explanation:Ican'tchangethevalueofai

C++ 如何在 Boost Global Logger 上设置严重性过滤器

几天来我一直在尝试创建一个BoostGlobalLogger以在整个应用程序中使用但我似乎无法在GlobalLogger中设置严重性级别。重要提示:在下面查看Andrey的回答...它被标记为步骤(a)和(b),但我仍然没有做对!直接来自Boost文档here...itwouldbemoreconvenienttohaveoneorseveralgloballoggersinordertoeasilyaccessthemineveryplacewhenneeded.Inthisregardstd::coutisagoodexampleofsuchalogger.Thelibrarypr

c++ - 双重比较 - 数值限制

我无法理解以下代码:doublea=-1000;doubleb=numeric_limits::min();if(a输出是:why?如何-1000低于numeric_limits::min()? 最佳答案 是因为numeric_limits::min();是以doublefloat表示的最小正数,而不是最大负数。 关于c++-双重比较-数值限制,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/ques