vector内对象的释放问题

挨踢民工的乐章 2012-07-20 05:03:55

typedefe struct _A
{
....;
}A;

vector<A> AS;

A a1 = new A;
A a2 = new A;

vector.push_back(a1);
vector.push_back(a2);


如果我用完了这个vector,怎么释放他,还有他里面的对象a1和a2?
...全文
427 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
小菜菜 2012-07-25
  • 打赏
  • 举报
回复
new 的对象用delete ,容器用Vector<A>().swap(AS)
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 5 楼 的回复:
根据楼主所描述的思路,正确的代码应该是:

C/C++ code

typedefe struct _A { ....; }*A; // 这个地方必须加一个*,这样A就是一个结构体指针类型了 vector<A> AS; A a1 = new A; A a2 = new A; vector.push_back(a1); vector.push_back(a2);……
[/Quote]

这里确实是我手误, 应该是 A *a1 = new A; A *a2 = new A;

这个应该大家能直接看出来
airwolf1216 2012-07-24
  • 打赏
  • 举报
回复
上面代码最后两句忘记加分号了
airwolf1216 2012-07-24
  • 打赏
  • 举报
回复
有这么纠结吗 new了的,就delete掉 逐个new 逐个delete
容器的clear 意思是清空容器中的元素,将容器变为空容器,但是你的元素是堆上申请的 你必须用那些指针去释放,在clear之前 释放掉他们 否则 吃内存

typedefe struct _A
{
....;
}A;

vector<A> AS;

A* a1 = new A;
A* a2 = new A;

vector.push_back(*a1);
vector.push_back(*a2);


……使用过程

释放的时候,这样:
vector<A>::iterator it1=AS.begin();
for(;it1!=ive1.end();it1)
{
delete it1
}

AS.clear()
z1848w 2012-07-23
  • 打赏
  • 举报
回复
delete x[]
lxgwm2008 2012-07-21
  • 打赏
  • 举报
回复
vector存放对象时,对存储的对象进行了拷贝。如果存放的是指针,则需要手动对该指针的对象进行释放
nickwu1220 2012-07-20
  • 打赏
  • 举报
回复

typedefe struct _A
{
....;
}A;

vector<A*> AS;

A *a1 = new A;
A *a2 = new A;

AS.push_back(a1);
AS.push_back(a2);

for(vector<A*>::iterator i = AS.begin(); i != AS.end(); ++i)
delete *i;
AS.clear;

nickwu1220 2012-07-20
  • 打赏
  • 举报
回复

typedefe struct _A
{
....;
}A;

vector<A*> AS;

A a1 = new A;
A a2 = new A;

AS.push_back(a1);
AS.push_back(a2);

for(vector<A*>::iterator i = AS.begin(); i != AS.end(); ++i)
delete *i;
AS.clear;
tangyla 2012-07-20
  • 打赏
  • 举报
回复
你这个必须手动一个一个释放,建议用boost库的shared_ptr,则可以自动释放。
pathuang68 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 5 楼 的回复:
根据楼主所描述的思路,正确的代码应该是:

C/C++ code

typedefe struct _A { ....; }*A; // 这个地方必须加一个*,这样A就是一个结构体指针类型了 vector<A> AS; A a1 = new A; A a2 = new A; vector.push_back(a1); vector.push_back(a2);……
[/Quote]

嗯,你说得对,大意了。
竞天问 2012-07-20
  • 打赏
  • 举报
回复
楼主可能是原先不是做C++的,有些东西没搞明白。


typedefe struct _A
{
....;
}A;

vector<A*> AS;

A *a1 = new A;
A *a2 = new A;

AS.push_back(a1);
AS.push_back(a2);

如果是这样的话,释放内存需要delete掉AS里相应的元素。

typedefe struct _A
{
....;
}A;

vector<A> AS;

A *a1 = new A;
A *a2 = new A;

vector.push_back(*a1);
vector.push_back(*a2);


这样应该要delete掉a1和a2,删除AS里的元素地址是不对的,因为std里的容器都会复制元素,new出来的元素只有a1和a2能指向了。
竞天问 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
根据楼主所描述的思路,正确的代码应该是:

C/C++ code

typedefe struct _A { ....; }*A; // 这个地方必须加一个*,这样A就是一个结构体指针类型了 vector<A> AS; A a1 = new A; A a2 = new A; vector.push_back(a1); vector.push_back(a2);



[/Quote]

楼主代码不对,你这个也不对啊

A a = new A;

无论在什么时候都不会对的。
前边是一个对象(即使本身是指针),后边是一个指针(如果对应一括号,这里是指针的指针),类型对应不上的。
thulongkang 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用楼主 的回复:
C/C++ code

typedefe struct _A
{
....;
}A;

vector<A> AS;

A a1 = new A;
A a2 = new A;

vector.push_back(a1);
vector.push_back(a2);



如果我用完了这个vector,怎么释放他,还有他里面的对象a1和a2?……
[/Quote]++++++++++++++++++++++++++++++++++
这位大神曾经也跟我说过同样的问题!非常感激他!
thulongkang 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

for( int i = 0; i < AS.size(); i++ )
{
delete AS[i]; //
}

AS.clear(); // clean()没有释放内存功能,所以必须先delete
[/Quote]++
太上绝情 2012-07-20
  • 打赏
  • 举报
回复
在a里定义析构函数,析构中输出一句话,vector执行clear()你就能知道是不是能自动释放了
pathuang68 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
C/C++ code

typedefe struct _A
{
....;
}A;

vector<A> AS;

A a1 = new A;
A a2 = new A;

vector.push_back(a1);
vector.push_back(a2);



如果我用完了这个vector,怎么释放他,还有他里面的对象a1和a2?
[/Quote]

首先必须说,楼主的代码是错误的。因为:

typedefe struct _A
{
....;
}A; // A并不是一个指针

vector<A> AS; // 容纳的是A类型的对象,而非new出来的A*,所以不需要自己去delete每个元素

A a1 = new A; // new A会得到一个指针A*,而a1却是一个A,两边的数据类型不同,错误。
A a2 = new A; // 同上

vector.push_back(a1);
vector.push_back(a2);


根据楼主所描述的思路,正确的代码应该是:

typedefe struct _A
{
....;
}*A; // 这个地方必须加一个*,这样A就是一个结构体指针类型了

vector<A> AS;

A a1 = new A;
A a2 = new A;

vector.push_back(a1);
vector.push_back(a2);


要析构AS中的每个元素,可以参考2楼的做法,或者用iterator。

一点建议:除非必要,通常不要在STL的容器中存放指针,直接存放对象会免去诸多麻烦。
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

0. AS.push_back(...
1. AS.clear();
[/Quote]

push_back();???
恨天低 2012-07-20
  • 打赏
  • 举报
回复
A a1 = new A; ???
A* pA = new A;

数据量大不大? 直接 A a 吧!
然后vector.push_back(a); 最后释放一下(clear)
zhiqiang_pobo 2012-07-20
  • 打赏
  • 举报
回复
for( int i = 0; i < AS.size(); i++ )
{
delete AS[i]; //
}

AS.clear(); // clean()没有释放内存功能,所以必须先delete
ohayou 2012-07-20
  • 打赏
  • 举报
回复
0. AS.push_back(...
1. AS.clear();

33,311

社区成员

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

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