杭州网站建设杭州手机网站建设,初学者wordpress商城模板,wordpress 远程数据库,wordpress后台字体使用定位new创建对象#xff0c;显式调用析构函数是必须的#xff0c;这是析构函数必须被显式调用的少数情形之一#xff01;#xff0c;
另有一点#xff01;#xff01;#xff01;析构函数的调用必须与对象的构造顺序相反#xff01;切记#xff01;#xff01;显式调用析构函数是必须的这是析构函数必须被显式调用的少数情形之一
另有一点析构函数的调用必须与对象的构造顺序相反切记定位new的使用格式
1.new (place_address) type
2.new (palce_address) type (initializer_list)
其中place_address必须是一个指针initializer_list是type类型的初始化列表
使用请看下面的代码例程
#include iostream
#include string
#include new
using namespace std;const int BUF 512;
class JustTesting {
private:string words;int number;
public:JustTesting(const string s Just Testing, int n 0) {words s;number n;cout words constructed endl;}~JustTesting() { cout words destroyed! endl; }void Show()const { cout words , number endl; }
};int main() {char* buffer new char[BUF];//常规new在堆上申请空间cout \nMemory block address:\n buffer: (void*)buffer \n****************************************\n;JustTesting* pc1, * pc2;pc1 new (buffer) JustTesting;//定位newpc2 new JustTesting(Heap1, 20);//常规newcout \nMemory contents: endl;cout pc1 : ;pc1-Show();cout pc2 : ;pc2-Show();cout ----------------------------------------\n;JustTesting* pc3, * pc4;pc3 new (buffer)JustTesting(Bad Idea, 6);//定位newpc4 new JustTesting(Heap2, 10);//常规newcout \nMemory contents: endl;cout pc3 : ;pc3-Show();cout pc4 : ;pc4-Show();delete pc2;//释放pc2申请的空间delete pc4;//释放pc4申请的空间delete[] buffer;//释放buffer指向的空间,但是这里并没有调用其析构函数//pc3-~JustTesting(); //需要显式调用构造函数//pc1-~JustTesting();cout Done! endl;return 0;
}
执行结果如下: 结果分析
1.使用定位new创建的对象的地址与内存缓冲区地址一致说明定位new并没有申请新空间而构造函数的调用说明定位new的确调用了构造函数。
2.在使用delete回收空间时可以发现并未回收pc1与pc3其原因在于pc1与pc3指向的对象位于内存缓冲区该空间并不是定位new申请而是常规new申请的因此我们需要delete[]回收内存缓冲区而不是delete pc1与delete pc3
3.pc1与pc3一致说明第一个对象被第三个覆盖显然如果类动态地为其成员分配内存这将引发问题所以当我们使用定位new创建对象必须自己保证不会覆盖任何不想丢失的数据就这个例程而言避免覆盖最简单的做法如下pc1 new (buffer) JustTesting;pc3 new (buffer sizeof(JustTesting)) JustTesting(Better Idea!,6);
4.delete[] buffer并未引发对象的析构虽然对象1及3的空间被回收但对象1与3并未析构这一点将时刻提醒我们使用定位new需要自己显式调用析构函数完成对象的析构但该析构并不能通过delete pc1或delete pc3实现因为delete与定位new不能配合使用否则会引发运行时错误只能通过显式析构如下pc3-~JustTesting();pc1-~JustTesting();