首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于析构的自动与手动调用解决办法

2014-01-09 
关于析构的自动与手动调用#include stdio.h#include iostreamusing namespace stdclass A{public:~A(

关于析构的自动与手动调用
#include "stdio.h"
#include <iostream>

using namespace std;
class A{
public:
~A(){cout << "xigou"<< endl;}
};

main(){
A* a = new A();
a->~A();
a->~A();
a->~A();

getchar();
delete a;

getchar();
}

该程序在vc,gcc下均正常运行
想说明的是
1.手动析构 == 调用函数
2.自动析构 == 调用函数同时销毁本身,后一个行为由系统完成,用户不能参与

若果还是不明白,我无语
[解决办法]
你的说明是错误的。析构函数无论显式还是隐式调用,类对象都被销毁,不再存在了。在此之后对该对象的操作都属于未定义行为。
[解决办法]

引用:
你的说明是错误的。析构函数无论显式还是隐式调用,类对象都被销毁,不再存在了。在此之后对该对象的操作都属于未定义行为。

还是别说了,人家不信标准的。
[解决办法]
............
[解决办法]
膜拜一下。
看过《execptional c++》item40/41的人飘过。
[解决办法]
引用:
#include "stdio.h"
#include <iostream>

using namespace std;
class A{
public:
~A(){cout << "xigou"<< endl;}
};

main(){
A* a = new A();
a->~A();
a->~A();
a->~A();

getchar();
delete a;……


#include<iostream>
#include<algorithm>
using namespace std;


class Test
{
  public:
    Test(void):_ch(new char)
    {
      *_ch = '*';
    }
    ~Test(void)
    {
      delete _ch;
    }

    void PrintCh(void){ cout<<*_ch; }
  private:
    char *_ch;
};

int main(int argc, char **argv)
{
  Test t;
  t.PrintCh();

  t.~Test();

  t.PrintCh();  //请解释下这里为什么会挂掉...楼主态度温和点,大家都在学习^^

  return EXIT_SUCCESS;
}
[解决办法]
析构可以手动、自动的调用,自动调用会销毁本身,手动不会,同是是否支持手动析构时对同一内存的多次释放由编译器决定
-----------------------------------------------------------------------------
没看见里面的举例???

[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. ]

你明白什么叫explicitly invoked么?






本人比较讨厌说undefined 了,标准之所以undefined ,是因为大千世界变化莫测的,无法全部defined   
但 实现必须是defined,否则就是二义了
只有极少数的undefined 情况会在不同编译器之间产生分歧
undefined 的情况之所以成为undefined ,是因为当时不知道如何defined ,或者哪种defined是合适的
最终都将被实践一一defined掉
若有undefined 情况,请先怀疑自己是否学懂了,同时坚信不久将来必定被defined掉

一家之言,晒晒体会,见笑了
---------------------------------------------------------------------
我笑了,真的.......
[解决办法]
你们天天过招,我好学习.
谢谢啦
[解决办法]
英文字母都视若无物,你牛,我投降.......
[解决办法]
#include<iostream>
#include<cstring>
using namespace std;


    struct Test{
  char *p;
  Test():p(new char[5]){strcpy(p,"hello");}
  void print(){ cout<<p<<endl;}
  ~Test(){ delete []p;p=NULL;}
};

int main()
{
    Test obj;
    obj.print();
    obj.~Test();
    obj.print();
    
    system("Pause");
    return 0;
}    
就在之前的那个帖子里面的代码。自己运行,我知道你很喜欢敲代码的。
[解决办法]
引用:
你们天天过招,我好学习.
谢谢啦


你来晚了,我已经投降了......
[解决办法]
我不明白手动调用析构函数有什么意义呀?
[解决办法]
引用:

引用:
你的说明是错误的。析构函数无论显式还是隐式调用,类对象都被销毁,不再存在了。在此之后对该对象的操作都属于未定义行为。


我不同意,请指出 手动析构后对象被销毁的证据,不是析构函数里面打印的东东
是证明该对象不能被正确访问的证据

我举的例子里面可以说明 手动析构后对象仍能被正常使用


能正常使用也属于未定义的一类
Once a destructor is invoked for an object, the object no longer exists; 
直译:一旦调用了某对象的析构函数,该对象不再存在

至于怎么证明这种“仍然可以正常使用”的情况属于未定义的,感觉应该让懂汇编的大侠帮忙。
[解决办法]
引用:
#include "stdio.h"
#include <iostream>

using namespace std;
class A{
public:
~A(){cout << "xigou"<< endl;}
};

main(){
A* a = new A();
a->~A();
a->~A();
a->~A();

getchar();
delete a;……

还有个问题...之所以导致大家跟你口水,你的问题没提明确啊................
我们现在研究的是析构函数调用之后对象的状态,但是你的问题没有明确指出,导致大家误解,
就像我刚才那段代码,我去研究析构函数执行之后对对象内部数据的影响而非对象本身了,
再商议商议
[解决办法]
避免去过问任何语言细节,除非必要。

实践中手动调用析构函数的真没怎么见过。。。

你们的讨论   很蛋疼。。。
[解决办法]
引用:
我现在只剩一个问题,楼主你年龄多大了?

从LZ的说话方式和喷人自信度判断,LZ不是90后
[解决办法]
实践出真理,看如下代码运行结果,你懂的

#include <iostream>

using namespace std;

class A
{
private:
int num;
public:
A()
{
}
~A()
{
cout<<"~A() is called"<<endl;
cout<<"num="<<num<<endl;
}
void SetNum(int value)
{
num=value;
}
int GetNum(void)
{
return num;
}
};


int main(void)
{
A *a=new A();
    a->SetNum(100);

a->~A();  //1

a->~A();  //2

delete a; //3

a->~A();  //4

return 0;
}

运行结果:
~A() is called   //1
num=100
~A() is called   //2
num=100
~A() is called   //3
num=100
~A() is called   //4
num=-572662307
[解决办法]
引用:
引用:
实践出真理,看如下代码运行结果,你懂的

#include <iostream>

using namespace std;

class A
{
private:
int num;
public:
A()
{
}
~A()
{
cout<<"~A() is called"<<endl;
cout<<"num="<<num……



是啊 这说明了 手动调用析构函数 对象本身是不会被销毁的 自动调用就会
[解决办法]
析构不进行内存回收,delete进行了内存回收,sy4238是这个意思吧
[解决办法]
我还以为我得出的结论有问题哦  谢谢

热点排行