关于虚构函数#includeiostreamusing namespace stdclass Clock{public:Clock(int Hour0,int Minute0,
关于虚构函数 #include"iostream" using namespace std; class Clock { public: Clock(int Hour=0,int Minute=0,int Second=0) { count++; } ~Clock() { count--; cout<<"destroy function"<<endl; } void Showcount() { cout<<count<<endl; } private: int Hour; int Minute; int Second; static int count; }; int Clock::count =0; int main() { Clock c1; c1.~Clock(); c1.Showcount(); return 0 ; } 手动调用不是已经销毁了对象c1了吗?为什么还能使用对象c1?为什么调用了2次析构函数? [解决办法]
引用: 析构函数一般很少被手动(显式)调用。可以认为唯一需要手动调用析构函数的地方,是销毁通过placement new创建的对象的时候。 另外由于c++标准中留有很多的 undefined behavior啥的。一个编译器运行结果有时候说明不了什么问题。 在面对undefined behavior行为时,编译器的运行结果可以说没有什么太大的价值。不要总是通过编译器的运行结果来分析问题。许多问题翻翻c…… 最讨厌说undefined 了,标准之所以undefined ,是因为大千世界变化莫测的,无法全部defined
但 实现必须是defined,否则就是二义了
只有极少数的undefined 情况会在不同编译器之间产生分歧
undefined 的情况之所以成为undefined ,是因为当时不知道如何defined ,或者哪种defined是合适的
最终都将被实践一一defined掉
若有undefined 情况,请先怀疑自己是否学懂了,同时坚信不久将来必定被defined掉
一家之言,晒晒体会,见笑了
[解决办法] 引用: Once a destructor is invoked for an object, the object no longer exists; the behavior is undefined if the destructor is invoked for an object whose lifetime has ended (3.8). [Example: if the destructo…… 因为我的英文不怎么好啊,你干嘛不翻译翻译呢?
另外,对于第一句话,你难道不可以理解为是 自动调用 ?至少,在c++中析构函数可以自动、手动调用
请注意 Exmple部分的 explicitly
Example: if the destructor for an automatic
object is explicitly invoked, and the block is subsequently left in a manner that would ordinarily invoke implicit destruction of the object, the behavior is undefined.
我的翻译:一个自动对象手动调用析构之后,因此而丢失的内存会在对象自动析构时可能再次被丢失,该行为是未决的
理解:手动析构不释放内存时,自动析构不会受影响,如果手动析构释放了内存,那么自动析构可能再次释放该内存,导致一种不可决定的行为
实践:编译器不支持二次释放同一内存的操作
[解决办法] 引用: 手动调用析构函数仅仅是调用了一个函数,对象本身不会被析构 并且当对象被销毁是系统自动再次调用析构 就是这个意思,要搞清楚手动调用和自动调用的区别。
自己定义的析构函数通常用于释放在构造函数或在对象生命期内获取的资源,和一些特定的操作(例如count--)。
此外编译器总是会为我们合成一个析构函数。合成析构函数按对象创建时的逆序撤销每个非 static 成员,它按成员在类中声明次序的逆序撤销成员。对于类类型的每个成员,合成析构函数调用该成员的析构函数来撤销对象。
看楼主自己定义的析构函数,自己显示调用,就只有count--,也就是一个很普通的函数调用,并没用销毁对象。
个人认为,某种程度上说,合成析构函数才是真正意义上的析构函数(真正意义上的析构了)。