replacement new 的问题

benh 2008-05-13 02:16:46
//将对象放在指定位置
const int comLoc = 0x00400000;
void * addLoc = reinterpret_cast<void *>(comLoc);
Tst * t = new (addLoc) Tst();
这里,怎么保证addLoc处已经申请了足够的内存呢? addLoc只是个地址,可是怎么知道sizeof(Tst)呢?
...全文
480 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2008-05-13
  • 打赏
  • 举报
回复
不要“网上看”,去找本好点的C++教材看。
比如,C++ Primer或者C++ Programming Language,书后索引表里找。
网上的东西,对错都搞不清楚。
benh 2008-05-13
  • 打赏
  • 举报
回复
这个是我从网上看到的一段代码,可能是作者留个自己看得。那么我下面的理解对不对?
placement new一般有两种用法,一个是在不重新申请内存的情况下初始化对象,另一个是将对象放在指定的位置。
第一种应用,有这样的代码
const size_t BUFSIZE=10;
const size_t n=sizeof(string)*BUFSIZE;
string * buf=static_cast<string *>(::operator new(n));
for(int i=0;i<BUFSIZE;i++)
...{
new (&buf[i]) string("fghdf"); //placement new 的使用
}
for(int j=0;j<BUFSIZE;j++)
cout << buf[j] << endl;
i=BUFSIZE-1;
while(i>=0)
...{
buf[i--].~basic_string();
}
::operator delete(buf);
第二种应用,对应最上面的代码,这么理解对吗
冷月清晖 2008-05-13
  • 打赏
  • 举报
回复
可以用C++ routines:
size_t _msize_dbg( void *userData, int blockType );
size_t _msize( void *memblock );

注意DEBUG版本应该用_msize_dbg.
原贴:http://topic.csdn.net/t/20020915/16/1025403.html
healer_kx 2008-05-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 taodm 的回复:]
“怎么保证addLoc处已经申请了足够的内存呢”
兄弟啊,那是正你作为程序员的职责。
[/Quote]

强烈的UP这句话,!!!
Treazy 2008-05-13
  • 打赏
  • 举报
回复
如果你本身堆上空间使用完了,你说怎么保证?
taodm 2008-05-13
  • 打赏
  • 举报
回复
“怎么保证addLoc处已经申请了足够的内存呢”
兄弟啊,那是正你作为程序员的职责。
xkyx_cn 2008-05-13
  • 打赏
  • 举报
回复
难道comLoc不是你申请的?

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧