设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1883|回复: 5
打印 上一主题 下一主题

还是STL问题

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-4 02:11:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
又遇到STL问题拉!请帮忙?
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(); }
...
};
2#
发表于 2009-11-4 02:11:09 | 只看该作者
以下是引用lixang在2007-1-24 19:44:00的发言:
又遇到STL问题拉!请帮忙?
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(); }
...
};

“placement new”的用法:
> new(p) value_type(x);
在p所指向的内存处初始化一个对象,即这种形式的new本身不分配内存,而是利用已有内存。
需要注意的是,当释放这块内存时,内存上的对象的析构函数并不会被调用,所以需要自己调用它的析构函数,如:
> p->~value_type();

想了解更多,请参考C++教程。
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-4 02:11:10 | 只看该作者
楼上说的不完整 如果p的类型不是类类型,那么delete p确实是不会调用析构函数,如果是 delete “new(p) value_type(x)“所返回的地址,是会调用析构函数的
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-4 02:11:11 | 只看该作者
以下是引用tyc611在2007-1-25 1:07:00的发言:


“placement new”的用法:
> new(p) value_type(x);
在p所指向的内存处初始化一个对象,即这种形式的new本身不分配内存,而是利用已有内存。
需要注意的是,当释放这块内存时,内存上的对象的析构函数并不会被调用,所以需要自己调用它的析构函数,如:
> p->~value_type();

想了解更多,请参考C++教程。
那就是说 new(p) value_type(x); 是分配了一个p让P指向了一个value_type型的 x
// 引用上面:即这种形式的new本身不分配内存,而是利用已有内存。不大明白?
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-4 02:11:13 | 只看该作者
以下是引用热情依然在2007-1-26 11:52:00的发言:
楼上说的不完整 如果p的类型不是类类型,那么delete p确实是不会调用析构函数,如果是 delete “new(p) value_type(x)“所返回的地址,是会调用析构函数的

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;
}
回复 支持 反对

使用道具 举报

6#
发表于 2009-11-4 02:11:14 | 只看该作者
以下是引用lixang在2007-1-26 12:28:00的发言:


那就是说 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的回复
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-19 00:42 , Processed in 0.111778 second(s), 8 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表