placement new 笔记

之前看到 偶尔用placement new 的用法,当分配内存频繁,而且对效率要求很高的情况下,可以先申请一块大内存,然后在此内存上构建对象,关键是可以自动调用其构造函数,否则要悲剧。

但是之后要自己显式调用其析构函数,因为编译器也认为这是你new出来的,不会帮你调用,当然类在析构的时候做了两件事,调用析构函数,然后把内存还给os,对于placement new同样也需要这么做,但是要自己做:

 1 #include <iostream>
 2 
 3 #include <new>
 4 #include <cstdlib>
 5 #include <vector>
 6 
 7 using namespace std;
 8 
 9 class A
10 {
11 public:
12     A()
13     {
14     }
15     ~A()
16     {
17         cout << "~A\n";
18     }
19 private:
20     vector<int> m_Vec;
21 };
22 
23 int main() 
24 { 
25     void *lpBuffer = std::malloc(1024);
26 
27     if (NULL != lpBuffer)
28     {
29         A *lpA = new (lpBuffer) A();
30         /* more code .. register with symbol tables etc.. */
31         lpA->~A();
32     }
33     delete lpBuffer;
34 
35     A lA;
36 }

如果注释掉31行,就会发现A的析构不会被调到,因此要显示析构。

posted @ 2013-06-30 06:31  hailong  阅读(205)  评论(0编辑  收藏  举报