1.显式调用析构函数
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass()
{
cout << "constructor of myclass." <<endl;
}
~MyClass()
{
cout << "destructor of myclass." <<endl;
}
};
int main(int argc, char* argv[])
{
MyClass *pmycls = new MyClass;
pmycls->~MyClass();
delete pmycls;
return 0;
}
输出结果:
constructor of myclass.
destructor of myclass. // 显式调用的析构函数
destructor of myclass. // delete调用的析构函数
由以上结果可以看出,new的时候做了两件事,一是调用malloc分配所需内存,二是调用构造函数
delete的时候也做了两件事,一是调用析构函数,二是调用free释放内存
正常情况下析构函数只会被调用一次,如果被调用两次,而析构函数内有delete的操作,会导致内存释放两次的错误。
显式调用析构函数的作用:有时候,在对象的生命周期结束之前,想先结束这个对象时就可以派上用场。
2.显式调用构造函数一
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass()
{
cout << "constructor of myclass." <<endl;
}
~MyClass()
{
cout << "destructor of myclass." <<endl;
}
};
int main(int argc, char* argv[])
{
MyClass *pmycls = (MyClass*) malloc(sizeof(MyClass));
//pmycls->MyClass(); // 编译出错,需pmycls->MyClass::MyClass();
pmycls->MyClass::MyClass();
free(pmycls);
return 0;
}
输出
constructor of myclass
3.显式调用构造函数二(placement new)
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass()
{
cout << "constructor of myclass." <<endl;
}
~MyClass()
{
cout << "destructor of myclass." <<endl;
}
};
int main(int argc, char* argv[])
{
char* buf = new char[sizeof(MyClass)];
MyClass *pmycls = new(buf) MyClass;
pmycls->~MyClass(); // 一旦对象使用结束,需要显式调用析构函数结束该对象
delete []buf; // 释放缓存
return 0;
}
输出结果:
constructor of myclass
destructor of myclass
placement new的作用就是:创建对象(调用该类的构造函数)但是不分配内存,而是在已有的内存块上面创建对象。用于需要反复创建并删除的对象上,可以降低分配释放内存的性能消耗。
关于placement new不用delete删除对象的说明:placement new并不分配内存,只是返回指向已经分配好的某段内存的一个指针。因此不能删除它,但需要调用对象的析构函数。
显式调用构造函数的作用:有时候,可能会考虑到效率而使用malloc给类对象分配内存,因为malloc不调用构造函数,这时候就派上用场了
参考:http://www.cnblogs.com/fangyukuan/archive/2010/08/28/1811119.html