类指针做list的类型时,如何管理指针的释放?

limingjiu 2009-07-31 10:46:34
如题:
如下代码,指针pMd何时释放?

class IModule
{
public:
virtual void func();
}

class B:public IModule
{

}

void main()
{
List<IModule*> mList;
IModule * pMd = new B();
mList.push_back(pMd);
........
}


我在使用如上代码的时候,发现如果用虚基类指针做list的模版类时,
传入的指针不知道如何释放,在叠代使用已插入的指针时,发现指针对应的虚函数为空,
想问几个问题:
1、list在内部是否会自己维护另一块内存?
2、如果问题1成立,因为传入的是new出来的指针,list内部创建另一个对象的时候,应该也仅仅new 一个指针而已,那么
类的虚函数怎么初始化?
...全文
640 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
limingjiu 2009-07-31
  • 打赏
  • 举报
回复
OK,没内存泄露了
因为list是我自己写的类,不知道STL本身对指针的管理是如何的,
所以~~
谢谢大家,结贴。
pengzhixi 2009-07-31
  • 打赏
  • 举报
回复
1、list在内部是否会自己维护另一块内存?
list只维护自己的内存,至于list里面存放的是指针,这个指针指向new出来的那块内存不归list管理,所以IModule *指向new出来的那块内存你要自己释放。list可不管。

2、如果问题1成立,因为传入的是new出来的指针,list内部创建另一个对象的时候,应该也仅仅new 一个指针而已,那么类的虚函数怎么初始化?
list只维护IModule *这个指针本身的内存。就你这个题目来说list内部本身的节点可能是这样的
struct list_node{
list_node<IModule *> *prev;
list_node<IModule *> *next;
IModule * data;
}

list里面就一个list_node *这样一个指针。每加一个对象就增加一个list_node就是了
yshuise 2009-07-31
  • 打赏
  • 举报
回复
上面忘了写:
class A{
public:
virtual ~A(){}
};
yshuise 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 limingjiu 的回复:]
但是,像我如上的,
因为pMd是个临时指针变量,我想要的就是把这个临时new 出来的变量放入到list
中,无法保存到程序结束,这种情况下如何解决呢?
[/Quote]
这个不存临时变量的问题,指针拷贝的方法你还不清楚。
lori227 2009-07-31
  • 打赏
  • 举报
回复
在生命周期结束之前,如果是new出来的临时变量,就遍历delete掉..


也可以用智能指针试试,让它帮你管理...
adventurelw 2009-07-31
  • 打赏
  • 举报
回复
pMd本身是局域变量,但是new出来的IModule及其派生对象在你delete之前,是一直存在的直到程序结束。

所以list中保存的那个指针同样可以指向pMd指向的对象,可以到程序结束。
limingjiu 2009-07-31
  • 打赏
  • 举报
回复
哦,F5没刷那么快,我去试试,谢谢大家
limingjiu 2009-07-31
  • 打赏
  • 举报
回复
但是,像我如上的,
因为pMd是个临时指针变量,我想要的就是把这个临时new 出来的变量放入到list
中,无法保存到程序结束,这种情况下如何解决呢?
taodm 2009-07-31
  • 打赏
  • 举报
回复
楼主啊,你要学会把问题分拆。
没有继承参与进来时,你会么?
就比如list<int *>?
Vegertar 2009-07-31
  • 打赏
  • 举报
回复
将元素所指对象析构器定义为 virtual ,加入时采用 new, 容器的析构器对元素进行 delete
yshuise 2009-07-31
  • 打赏
  • 举报
回复
是这样的,一个基类有无数个派生类:
class A{};
class B: public A{};
class C: public A{};
class D: public A{};
class E: public A{};
A* pb = new B;
A* pc = new C;
A* pd = new D;
A* pe = new E;

list<A*> List_A;
list_A.push_back(pb);
list_A.push_back(pc);
list_A.push_back(pd);
list_A.push_back(pe);


释放内存:
typedef list<A*>::iterator iter;
iter a = list_A.begin();
iter b = list_A.end();
for(; a != b; a++)delete *a;
adventurelw 2009-07-31
  • 打赏
  • 举报
回复
类的虚函数的建立就是在你动态分配的时候。
xuxinmmy 2009-07-31
  • 打赏
  • 举报
回复
list<Type>

list只会维护这个指定的Type类型数据,你现在传出的IModule*,即list里面保存的是指针,就是四字节的数字,它指向的是你自己申请的对象,你要在适当的时候自己去释放之个对象

如果你用list <IModule> Mlist; 那list就是自己申请一个对象了,当然也不用你去释放它
adventurelw 2009-07-31
  • 打赏
  • 举报
回复
加入的时候动态分配

程序结束之前(应该是list对象结束之前)手动释放所有动态分配的内存

list维护的内存只管它的元素本身和指向前后节点的指针,不管你动态分配。
limingjiu 2009-07-31
  • 打赏
  • 举报
回复
code:
class IModule
{
public:
virtual void func();
}

class B:public IModule
{
}

void main()
{
list<IModule*> Mlist;
IModule * pMd = new B();
MList.push_back();
........
}

64,637

社区成员

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

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