请问如何在GlobalAlloc分配的内存上,创建一个stl 的 list 呢?

本文讨论了如何在通过GlobalAlloc分配的内存上创建并初始化STL的list对象。通过使用placement new操作符,可以在指定内存位置上正确地构造list实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  请问如何在GlobalAlloc分配的内存上,创建一个stl 的 list 呢?
楼主lglabc(会飞的熊猫) 2006-03-15 17:17:17 在 C/C++ / C++ 语言 提问

是这样的  
  分配全局内存  
  hMem   =   GlobalAlloc(GHND,   sizeof(MyCBStruct));  
   
  强制转换为我自定义的结构MyCBStruct  
  MyCBStruct   *pGlobal   =   (MyCBStruct*)GlobalLock(hMem);  
   
  我自定义的结构MyCBStruct中有一个stl的list链表  
  std::list<DWORD>   m_listDW  
   
  现在的问题是转换来的指针pGlobal   中的   m_listDW   好像是没有初始化的   (我也不太清楚)  
  总之,是不能进行任何操作,push_back,clear都不行  
   
  有没有办法能够初始化(也许是别的操作   -_-)这个list链表吗?  
  让我能进行正常的操作。。  
   
   
   
  谢谢! 问题点数:100、回复次数:17Top

src="http://topic.youkuaiyun.com/Include/Board.htm?Tags=" frameborder="0" scrolling="no">

1 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2006-03-15 17:28:12 得分 100

你是想把list对象放到Global内存上,还是list管理的内容放到那块内存上?  
   
  第一个,  
  使用replacement   new  
  new   (pPtr)   std::list();  
   
  第二个  
  修改list<T,   A>的第二个模板参数,是Allocator,  
  你自己写个MyAlloc,分配的时候使用GlobalAlloc了、Top

2 楼lglabc(会飞的熊猫)回复于 2006-03-15 17:35:32 得分 0

我要的是第一种情况  
  把list对象放到Global内存上  
   
  不过我对replacement   new仅仅在书上看到过,不太明白它的使用和意义  
   
  new   (pPtr)   std::list();  
  其中的pPtr是什么呢?类型?还是指针?  
   
  谢谢!Top

3 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2006-03-15 17:37:49 得分 0

pPtr是你GA分配到的那个内存,然后我们在那个内存上构造list对象。  
  Top

4 楼lglabc(会飞的熊猫)回复于 2006-03-15 17:46:08 得分 0

明白了,就是在已经分配的内存空间上构造对象  
   
  不过好像编译器不认这种操作。。  
  vs   2003  
   
  因为,我用int   来试了试也失败了。。Top

5 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2006-03-15 17:50:21 得分 0

你要include一个头文件了。    
  记得是<new.h>Top

6 楼lglabc(会飞的熊猫)回复于 2006-03-15 17:54:19 得分 0

包含了还是失败。。。  
   
  难道是不标准的用法?Top

7 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2006-03-15 17:59:48 得分 0

不可能,你再调政下了。,Top

8 楼lglabc(会飞的熊猫)回复于 2006-03-15 18:09:14 得分 0

奇怪,控制台程序就能成功  
   
  MFC的程序就失败。。  
   
  难道MFC里面有什么冲突?Top

9 楼lglabc(会飞的熊猫)回复于 2006-03-15 18:10:26 得分 0

FT!!!  
  MFC下的release   就能成功  
   
  是不是DEBUG中对   new   进行了重写。。。Top

10 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2006-03-15 18:16:54 得分 0

呵呵,有个DEBUG_NEW嘛,你要注意include的位置吧?Top

11 楼lglabc(会飞的熊猫)回复于 2006-03-15 18:22:34 得分 0

貌似即使在后面包含<new>,DEBUG_NEW还是会起作用。。  
   
  汗,干脆屏蔽掉了。。  
   
  有没有啥其他好办法?Top

12 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2006-03-15 18:36:41 得分 0

不好说,那个是宏啊,它会进行简单的替换的,这个替换还是挺野蛮的哈~  
  那个宏只是帮你来检测DEBUG版本的内存泄漏的。  
   
  Top

13 楼lglabc(会飞的熊猫)回复于 2006-03-15 18:39:58 得分 0

没办法  
   
  只好屏蔽掉了,可惜看不到内存泄露了,这样也麻烦。。  
   
  对了  
   
  new   (pPtr)   std::list();好像还不能成功  
   
  这个显式使用list   的构造函数,怎么才能指定参数呢?  
   
  呵呵,麻烦甘草了  
  Top

14 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2006-03-15 18:44:12 得分 0

哦,我那个是简写的。。  
  list好歹也是模板类啊。  
   
  new   (p)   list<int>();  
  应该这样吧才对。Top

15 楼lglabc(会飞的熊猫)回复于 2006-03-15 18:50:27 得分 0

成功了!!!  
   
  谢谢healer_kx(甘草)。  
   
  唉,感慨一下:什么东西停留在表面迟早是要不行的。。  
  我当初用stl,现在用boost等等,全都是贪图省事,其实对模板一窍不通  
   
  以后要好好学习了  
   
  再次谢谢healer_kx(甘草)。  
   
  结帐!Top

16 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2006-03-15 18:58:55 得分 0

赚点分不容易啊。。。   。。。Top

17 楼lglabc(会飞的熊猫)回复于 2006-03-17 17:25:47 得分 0

哈哈,甘草缺分的话  
   
  可以多来回答我的问题,几千分我还是有的^0^Top

相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值