之前看到 偶尔用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 "; 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的析构不会被调到,因此要显示析构。