草庐IT

c++ - Qt如何删除QObjects?

据我了解,以下代码是创建QObject的完美方式QLabel*label=newQLabel("label");QWidgetwindow;label->setParent(&window);window.show();当我在无处不在阅读时,“父对象获得了新创建对象的所有权——并最终调用了删除”,或者“复合对象获得了子对象的所有权,因此,只要父类拥有完成后,您可以放心,当父级被销毁时,子QObjects将被销毁”(来自HowdoesQtdeleteobjects?AndwhatisthebestwaytostoreQObjects?)有人能告诉我Qt如何“取得”QObject的所有权吗

c++ - 删除 void 指针除了调用全局删除运算符之外还能做些什么?

C++标准非常清楚明确地声明在void指针上使用delete或delete[]是未定义的行为,如引用在thisanswer:Thisimpliesthatanobjectcannotbedeletedusingapointeroftypevoid*becausetherearenoobjectsoftypevoid.但是,据我所知,delete和delete[]只做两件事:调用适当的析构函数调用适当的operatordelete函数,通常是全局函数有一个单参数operatordelete(以及operatordelete[])和thatsingleargumentisvoid*ptr.

c++ - 所有 g++ 版本的 delete[] 可能存在错误或未定义此行为?

这个问题在这里已经有了答案:Whyisitundefinedbehaviortodelete[]anarrayofderivedobjectsviaabasepointer?(5个答案)关闭4年前。我有这段代码,它给了我3个或更多元素的段错误。我在vs和clang上测试并工作(循环结束和二进制结束没有错误)。我做错了什么?或者它是一个g++错误?如果我更改delete[]线到delete[]static_cast(a);它也适用于g++。但是,在实际情况下,我不知道真正的类型,所以我不能转换成任何东西。classA{public:virtual~A(){}virtualintx()=0

c++ - 为什么 new 和 delete 在 MSVC 2010 下的循环中这么慢

当我尝试在循环中创建和删除类的实例时遇到问题。迭代的执行时间是完全不同的。据我了解,这与从内存中删除对象有关。但是,这个操作的行为我不明白。为什么时间不同?我如何解决它?当我在单独的线程中删除对象时,时间是稳定的。classNODE{public:NODE(){}NODE*add(NODE*node){children.push_back(node);returnnode;}virtual~NODE(){for(vector::iteratorit=children.begin();it!=children.end();++it){delete*it;}}vectorchildren;

c++ - 运算符删除不清楚

我是C++的新手,我有一些不清楚的地方:#includeusingnamespacestd;double*foo(void){double*b=newdouble[100];returnb;}intmain(){double*a=foo();delete[]a;return0;}这段代码有问题吗?我的意思是我使用operatordelete的方式是否正确?我把foo函数中指向已分配内存的指针b赋值给foo外的指针a,是否可以在main中通过delete[]a释放内存?我不知道编译器如何计算执行delete[]时要释放的字节数。谢谢 最佳答案

c++ - 为什么 "const T*"在 "void*"中被简单地转换为 "operator delete"?

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Deletingapointertoconst(Tconst*)voidoperatordelete(void*);...constchar*pn=newchar,*pm=(char*)malloc(1);deletepn;//allowed!!free(pm);//errorDemo.可以理解,free()是一个函数,所以constvoid*不能转换为void*。但为什么在operatordelete(默认或重载)的情况下允许这样做?它在功能上不是错误的构造吗?

c++ - 我是否负责在 QImage::bits() 函数提供的指针上调用 delete?

Qt类QImage有两个版本的bits()函数,返回指向底层图像数据的指针。一个是const,另一个不是。这是thedocumentation对于非常量版本:Returnsapointertothefirstpixeldata.ThisisequivalenttoscanLine(0).NotethatQImageusesimplicitdatasharing.Thisfunctionperformsadeepcopyofthesharedpixeldata,thusensuringthatthisQImageistheonlyoneusingthecurrentreturnvalue

c++ - 为什么使用一个参数而不是两个参数调用释放函数?

我一直在努力理解以下行为:#include#includeusingnamespacestd;structA{voidoperatordelete[](void*p){coutdemo在示例中,调用了带有一个参数的非放置释放函数。但是5.3.6/10N3797C++14工作草案说:Ifthetypeiscompleteandifdeallocationfunctionlookupfindsbothausualdeallocationfunctionwithonlyapointerparameterandausualdeallocationfunctionwithbothapointer

c++ - 为什么下面的 C++ 赋值时没有内存泄漏?

以下代码降低了我或多或少了解C++的信念。为什么valgrind在这里没有显示任何内存泄漏?为什么我期望内存泄漏:B比A大:它包含一个额外的成员;所以在分配时应该有类的字段切片。~A()没有虚拟驱动程序。因此,当我们调用deletea时,只应调用~A()并且B中分配的内存将丢失。但我收到dtor的调用顺序是:~A()、~B()、~A()。为什么?!structA{~A(){std::cerrmain():A*a=newA;B*b=newB;*a=*b;deletea;deleteb;更新:我真丢人!当应该调用虚拟dtor时,我通过基类的指针混淆了一个对象的删除。这里只是复制类的内容。谢

c++ - 通过引用与通过值传递指向函数的指针,以及在指针链上使用 delete

假设我这样做:voidfunc(int*&refptr){*refptr=7;}int*ptr=newint;func(ptr);现在,如果我不使用引用运算符,在func中不会完成完全相同的事情吗?无论哪种方式,您都在堆中访问相同的int值,那么一种方式比另一种方式更可取吗?是否应该仅在您尝试更改指针...指向的位置时才使用引用运算符?我不清楚这一点,我的教授也没有帮助。:(我的另一个问题与删除运算符有关。假设我有:int**ptr=newint*;ptr*=newint;如果我想释放堆中分配的所有内存,我可以只对ptr使用delete一次,还是必须先删除ptr*然后再删除ptr?非常