C++语义与内存泄漏
这两天在看java,突然把其中的一些东西与C++联想到一起,由于java所有对象都是引用类型,又有垃圾回收机制,在类的实例的创建上的行为也有很大的不同,于是编了段C++代码验证,现在在想到底下面的代码到底会不会有内存泄漏问题呢?
#include <iostream>
using namespace std;
class myclass
{
myclass* _this;
private://把构造函数变为私有,可以禁止用户直接生成实例而用下面的静态方法来生成
myclass()
{
cout << "Begin" << endl;
}
public:
~myclass()
{
cout << "End" << endl;
}
static myclass& buildmyclass()//让这个静态方法来创建类的实例
{
myclass* o = new myclass();
o->_this = o;
return *o;
}
};
void test()
{
myclass p = myclass::buildmyclass();//调用静态方法生成实例
}
int main()
{
test();
}
程序的结果是
Begin
End
也就是说构造函数与析构函数都被调用了,但buildmyclass静态方法中的new没有与之对应的delete,简而言之,当一个函数中new了一个对象(按理应该分配在堆中)并将其作为引用返回给调用函数中的一个自动变量(按理应该分配在栈中并在出了作用域自动释放),那么编译器的行为是什么呢?这里很显示自动变量出了作用域后调用了析构函数,那么堆内存有没有被释放呢?