64,654
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<stdlib.h>
class TypeA
{
public:
TypeA()
{
printf("Initlizing instance at %d\n",(int)this);
}
methodTest()
{
printf("Calling methodTest for instance %d\n",(int)this);
}
~TypeA()
{
printf("UnInitlizing instance at %d\n",(int)this);
}
}
TypeA getA()
{
return TypeA();
}
int main()
{
getA().methodTest();
system("pause");
return 0;
}
Initlizing instance at 0x1238c980
Calling methodTest for instance 0x1238c980
UnInitlizing instance at 0x1238c980
int main()
{
TypeA a = getA();
a.methodTest();
printf("Mark\n");
system("pause");
return 0;
}
这么写析构就在Mark之后了
#include<stdio.h>
#include<stdlib.h>
class TypeA
{
public:
TypeA()
{
printf("Initlizing instance at %d\n",(int)this);
}
methodTest()
{
printf("Calling methodTest for instance %d\n",(int)this);
}
~TypeA()
{
printf("UnInitlizing instance at %d\n",(int)this);
}
}
TypeA getA()
{
return TypeA();
}
int main()
{
getA().methodTest();
printf("Mark");
system("pause");
return 0;
}
Initlizing instance at 0x1238c980
Calling methodTest for instance 0x1238c980
UnInitlizing instance at 0x1238c980
Mark
对象在Mark之前析构了,而且所有函数调用都是针对的同一个实例。
1.这个实例是在getA() 函数堆上面生成的实例,却能在函数外面调用它。
2.堆上生成的实例应该在函数结束时析构,但在实例析构前发生了methodTest()的调用,函数的原子性都没有保证
[/quote]
1. 对象是在栈上的,new 的才在堆上呢。
2. 堆上生成的对象在 delete 时析构。程序里的是临时对象,在 full expression 末尾(即 ; 处)按生成顺序反序析构,所以 mark 前面就析构了。函数本来也没有原子性。