template <class T> class malloc_allocator
{
public:
void construct(pointer p, const value_type& x) {
new(p) value_type(x); //帮忙解释以下语法?
}
void destroy(pointer p) { p->~value_type(); }
...
};
 2007-01-24 19:44
	    2007-01-24 19:44
  “placement new”的用法:
> new(p) value_type(x); 
在p所指向的内存处初始化一个对象,即这种形式的new本身不分配内存,而是利用已有内存。
需要注意的是,当释放这块内存时,内存上的对象的析构函数并不会被调用,所以需要自己调用它的析构函数,如:
> p->~value_type(); 
想了解更多,请参考C++教程。

 2007-01-25 01:07
	    2007-01-25 01:07
  
 2007-01-26 11:52
	    2007-01-26 11:52
  “placement new”的用法:
> new(p) value_type(x); 
在p所指向的内存处初始化一个对象,即这种形式的new本身不分配内存,而是利用已有内存。
需要注意的是,当释放这块内存时,内存上的对象的析构函数并不会被调用,所以需要自己调用它的析构函数,如:
> p->~value_type(); 
想了解更多,请参考C++教程。
那就是说 new(p) value_type(x); 是分配了一个p让P指向了一个value_type型的 x
   // 引用上面:即这种形式的new本身不分配内存,而是利用已有内存。不大明白?
[此贴子已经被作者于2007-1-26 12:29:38编辑过]
 2007-01-26 12:28
	    2007-01-26 12:28
  
1. p只是一段内存空间的指针罢了,它的类型是指针类型!
2. "如果是 delete 'new(p) value_type(x)'所返回的地址,是会调用析构函数的 ",对! 
    我上面是说的delete p; 不会调用类的析构函数
写了个示例代码:
#include <iostream>
using namespace std;
class Test
{
public:
    Test(int num) {
        m_num = num;
        cout<<"Construtor: "<<num<<endl;
    }
    ~Test() {
        cout<<"Destructor"<<endl;
    }
private:
    int m_num;
};
int main() 
{
    char *pMem = new char[1000];
    Test *pTest = new(pMem) Test(10);
    
    // The following statement is equivalent to "delete pTest"
    pTest->~Test();   // If there is no this statement, 
                      // the destructor will not be called
                      // Try to comment it, and then run this program
    delete [] pMem;
    
    return 0;
}

 2007-01-27 01:43
	    2007-01-27 01:43
  那就是说 new(p) value_type(x); 是分配了一个p让P指向了一个value_type型的 x
   // 引用上面:即这种形式的new本身不分配内存,而是利用已有内存。不大明白?
定位new的用法:pObj = new (pMem) value_type(init);
在执行这个语句前,pMem已经指向一段内存空间(且足够存储new的对象大小),执行这条定位new语句就是在pMem指向的内存空间上构造对象;如果用delete pObj释放对象,其只是调用对象的析构函数(如果是类对象的话),不会释放空间,这跟一般的delete不一样!
要释放空间还得释放pMem所指空间才行
示例见我LS的回复

 2007-01-27 01:49
	    2007-01-27 01:49