草庐IT

c++ - 我必须在 C++ 析构函数中收集什么垃圾

我正在编写一个C++析构函数(我希望这是正确的术语;我是C++的新手)并且我不确定我究竟需要什么来进行垃圾收集。假设我有2个指针作为实例变量,我需要对它们进行垃圾回收吗?如果我有一个对象作为实例变量呢?还是指向对象的指针?对于究竟需要删除什么以及自动清理什么,我只是有点模糊。谢谢 最佳答案 一般的经验法则是...如果您调用new,请调用delete。如果您调用了new[],请调用delete[]。如果您在类之外访问这些指针并有效地共享它们,您需要小心“拥有”对象delete正在使用的共享对象。垃圾收集这个词不太合适。您想要销毁对象并

c++ - 为什么不在 placement new 中隐式调用析构函数”?

如本网站所引用...http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10但是我没有找到原因,为什么我们要显式调用析构函数? 最佳答案 您可以将其视为对delete的调用,但由于您使用了placementnew,因此您不想使用delete,因为那样会尝试释放内存。如果你想让它自动调用,你可以使用RAII://Coulduseatemplatedversion,orfindanexistingimplsomewhere:voiddestroy_fred(Fred*f){f-

c++ - 为什么不能正确解析显式析构函数调用中的限定类型名称?

考虑一个例子。#includestructS{S(){new(&s)std::string("hi");}~S(){//doesnotcompile//s.~std::string();//compilesusingstd::string;s.~string();}union{std::strings;};};为什么注释掉的部分编译不了?我从clang得到的错误消息显示编译器将std本身解析为一个类型。identifier'std'inobjectdestructionexpressiondoesnotnameatype为什么编译器不能确定std::string是类型?这在某种程度上是

c++ - 所有Derived类都必须实现自己的析构函数,否则报编译错误?

最近面试官问了我下面的问题"派生类允许从基类继承,但所有派生类都必须实现用户定义的析构函数。如果派生类没有定义用户定义的析构函数,则报告编译错误。“任何想法,如何解决这个问题?想过在Baseclass中使用purevirtualdestructor来解决这个问题,但是并没有解决问题。对于下面的代码,我希望编译器报告一个错误,因为派生类没有实现用户定义的析构函数classBase{public:virtual~Base()=0;};Base::~Base(){cout 最佳答案 有一些方法可以使用异常规范强制执行显式声明的析构函数cl

【C++】C++入门—初识构造函数 , 析构函数,拷贝构造函数,赋值运算符重载

C++入门六个默认成员函数1构造函数语法特性2析构函数语法特性3拷贝构造函数特性4赋值运算符重载运算符重载赋值运算符重载特例:前置++与后置++前置++:返回+1之后的结果后置++:Thanks♪(・ω・)ノ谢谢阅读!!!下一篇文章见!!!六个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数我们实现了,编译器就不会生成了1构造函数构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一

c++ - 先调用析构函数再调用构造函数(重置对象)

我想重置一个对象。我可以通过以下方式进行吗?anObject->~AnObject();anObject=new(anObject)AnObject();//edit:thisisnotallowed:anObject->AnObject();这段代码显然是一个由inplacementnew分配的对象的典型生命周期的子集:AnObject*anObject=malloc(sizeof(AnObject));anObject=new(anObject)AnObject();//Mystep2.//...anObject->~AnObject();//Mystep1.free(anObje

c++ - 在多态性增加派生类大小的多重继承的情况下,在派生类中为析构函数编写代码。为什么?

#includestructBase1{public:virtualvoidshow()=0;};structBase2{public:virtualvoidDisplay()=0;};classDerived:virtualpublicBase1,virtualpublicBase2{public:virtualvoidshow(){}virtualvoidDisplay(){}};voidmain(){usingnamespacestd;cout输出显示12但是当我插入Dervied类的析构函数时,即以下代码#includestructBase1{public:virtualvoi

c++ - 空析构函数导致代码缓慢?

我正在为非STL容器类型实现自定义迭代器并遇到以下行为,在这个阶段,这对我来说似乎有点出乎意料。当您定义一个“空”dtor时,似乎会对性能产生重大影响?为什么??为了深入了解这一点,我为std::vector实现了一个简单的迭代器,这样我就可以直接与标准STL迭代器比较性能。为了公平测试,我简单地从“vector.hpp”复制了一个简化的实现,并尝试添加一个额外的“空”dtor:templateclassmy_slow_iterator//notinheritingfromanything!!{public:_Myvec::pointer_ptr;//pointertovectorel

c++ - 当派生定义了析构函数时,使用复制构造函数而不是移动构造函数

当我向派生类添加析构函数时,当它尝试使用复制构造函数而不是定义的移动构造函数时,我会遇到编译器错误(使用gcc4.7):#include#includetemplatestructBase{Tvalue;Base(T&&value):value(value){std::coutstructDerived:publicBase{Derived(T&&value):Base(std::forward(value)){std::coutDerivedMakeDerived(T&&value){returnDerived(std::forward(value));}structDummy{};

c++ - 在 Shutdown() 方法而不是析构函数中清理

在RastertekDirectXtutorials他们有空的构造函数和析构函数,而是使用initialize()和shutdown()函数来初始化和清理对象。使用此设计一段时间后,我可以稍微了解使用initialize()方法的好处,但我看不出使用shutdown()方法有什么用比将所有清理代码放在析构函数中更好。他们提供的原因如下:YouwillalsonoticeIdon'tdoanyobjectcleanupintheclassdestructor.IinsteaddoallmyobjectcleanupintheShutdownfunctionyouwillseefurthe