有关STL的问题(内存删除的先后顺序)

thulongkang 2012-07-17 09:48:09
如下代码是在vector容器中装入指针元素:
vector<object*> vec;//object是已经定义好的一个类
object *p;
for (int i=0;i<5;i++)
{
p = new object;
.....//给每个元素加上一些东西,例如标号等
vec.push_back(p);
}
如果我使用erase()方法,删掉某些元素的数据,更极端一些,我直接使用clear(),那么,如果我想把我当初分配的内存删除该怎么做?还要采用一些迭代器的方法么?目前我有一个思路是,另外构建一个空的容器(数据也是指向对象的指针,不妨称为vec2),让该容器的每个指针和上面初始化的容器中的指针指向相同,我能不能把vec2放在一边,然后vec是erase()也好,clear()也好,最终我只要利用vec2把内存删除就行了?
...全文
122 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
thulongkang 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

C/C++ code
vector<object*> vec;//object是已经定义好的一个类
object *vec2[5];
object *p;
for (int i=0;i<5;i++)
{
p = new object;
vec2[i]=p;
.....//给每个元素加上一些东西,例如标号等
vec.push_back(p);
}
//...
……
[/Quote]fopen和fclose是什么?没学过啊!
赵4老师 2012-07-18
  • 打赏
  • 举报
回复
vector<object*> vec;//object是已经定义好的一个类
object *vec2[5];
object *p;
for (int i=0;i<5;i++)
{
p = new object;
vec2[i]=p;
.....//给每个元素加上一些东西,例如标号等
vec.push_back(p);
}
//...
for (int i=0;i<5;i++) delete vec2[i];
//将new和delete象fopen,fclose那样用。
thulongkang 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

你的代码里面容器里面保存的是一个指针,当你erase或者clear之前没有释放相应的内存那么做完这个操作之后,

你已经找不到这个指针了,所以这个指针所指向的内存无法释放。这种做法本来就是错误的。如果你再用另一个容

器,仅仅为了做内存释放,那就是明明错了,你确去掩饰这个错误,而非解决这个错误。这样不可取!
[/Quote]现在编写一个程序,我想到的是必须这样用啊!难道没什么好办法了么?
wansbest 2012-07-18
  • 打赏
  • 举报
回复
你的代码里面容器里面保存的是一个指针,当你erase或者clear之前没有释放相应的内存那么做完这个操作之后,

你已经找不到这个指针了,所以这个指针所指向的内存无法释放。这种做法本来就是错误的。如果你再用另一个容

器,仅仅为了做内存释放,那就是明明错了,你确去掩饰这个错误,而非解决这个错误。这样不可取!
thulongkang 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:

引用 5 楼 的回复:

引用 4 楼 的回复:

你把所有指针变量全部给clear了,那么我想知道,你怎么才能获得你使用new得到的内存的指针??
是不是不能这么干?


显然不能
指针指向的对象要先删掉,指针才能删
那我这样做,会造成内存泄露了(采用副本的方式)?
[/Quote]求解释啊!!!!!!!
thulongkang 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 5 楼 的回复:

引用 4 楼 的回复:

你把所有指针变量全部给clear了,那么我想知道,你怎么才能获得你使用new得到的内存的指针??
是不是不能这么干?


显然不能
指针指向的对象要先删掉,指针才能删
[/Quote]那我这样做,会造成内存泄露了(采用副本的方式)?
方南橘 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:

你把所有指针变量全部给clear了,那么我想知道,你怎么才能获得你使用new得到的内存的指针??
是不是不能这么干?
[/Quote]

显然不能
指针指向的对象要先删掉,指针才能删
thulongkang 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

我记得容器的操作只是针对容器元素本身,如果元素是指针,那么clear()只是把指针都删了,而不会对每个指针指向的东西调用析构函数,如果是这样的话,那么只有一个指针容器存在的话,调用clear()必然会造成内存泄露。
如果在此之前复制了一个副本,那么原本删了就删了,不影响副本的使用,所以VEC1清空以后,再对VEC2的每个指针元素调用delete,就完成了new-delete配对,不会造成内存泄……
[/Quote]我的想法到底对不对?恳请各位大神分析一下。
thulongkang 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

你把所有指针变量全部给clear了,那么我想知道,你怎么才能获得你使用new得到的内存的指针??
[/Quote]是不是不能这么干?
W170532934 2012-07-17
  • 打赏
  • 举报
回复
你把所有指针变量全部给clear了,那么我想知道,你怎么才能获得你使用new得到的内存的指针??
taodm 2012-07-17
  • 打赏
  • 举报
回复
楼主还是找本《effecitve stl》紧急啃啃吧。
cgscylla 2012-07-17
  • 打赏
  • 举报
回复
我记得容器的操作只是针对容器元素本身,如果元素是指针,那么clear()只是把指针都删了,而不会对每个指针指向的东西调用析构函数,如果是这样的话,那么只有一个指针容器存在的话,调用clear()必然会造成内存泄露。
如果在此之前复制了一个副本,那么原本删了就删了,不影响副本的使用,所以VEC1清空以后,再对VEC2的每个指针元素调用delete,就完成了new-delete配对,不会造成内存泄露。
楼主的想法应该是对的。
本人也是菜鸟,说错了勿怪。
thulongkang 2012-07-17
  • 打赏
  • 举报
回复
我这样考虑是想到既然vec调用erase()或者clear()了,元素是不是不能访问了?
也许我这个想法不正确,希望大家能帮忙解答。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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