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

关于C++析构函数 在VS2008底下编译

2013-07-16 
关于C++析构函数 在VS2008下面编译class A{private:int apublic:A(int b 10):a(b){coutstructend

关于C++析构函数 在VS2008下面编译
class A{
private:
int a;
public:
A(int b = 10):a(b){cout<<"struct"<<endl;}
~A(){cout<<"destruct"<<endl;}
void start() {
cout<<a<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A* b;
{
A a(2);
b = &a;
b->start();
}
b->start(); //这里a已经被析构了,为什么这里不报错呢!?
getchar();
return 0;
}
[解决办法]
A a(2); A* b; 都是在栈中创建的,它们在_tmain返回后才会被清栈销毁
[解决办法]
A* b;
{
    A a(2);
    b = &a;
    b->start();
     // 在这里a被析构了,b变成野指针
}
b->start(); // 这里使用野指针,不一定报错
[解决办法]
我的认为就是那块内存析构只是告诉操作系统,那是空闲的了,,但那块内存还真真的在那里,而且里面数据没有变动,,所以它还能执行~~

具体测试你在析构里把a的值改改,,后面还能输出。~
[解决办法]

引用:
Quote: 引用:

A* b;
{
    A a(2);
    b = &a;
    b->start();
     // 在这里a被析构了,b变成野指针
}
b->start(); // 这里使用野指针,不一定报错

但是他能够正常运行  并且打出了10这个值。感觉一切正常。
纳闷!

没啥纳闷的,为了效率,不会在析构的时候将内存数据清0。
所以得到10很正常。再加点其他代码说不定就得不到10了。

热点排行