请教:关于vector的内存释放

Cafes 2003-10-15 05:28:08
刚开始接触STL的东西,遇到些问题想请教一下前辈们

假设有这样一个声明
vector<vector<int> *> _assignment_stack;

给这个vector赋值如下
for (int i=0; i<variables().size(); ++i)
_assignment_stack.push_back(new vector<int>);

具体每个_assignment_stack[i]有如下方式加入新的值
int literal
....
_assignment_stack[dl]->push_back(literal);

现在问题是
如何把这个_assignment_stack所占的内存空间彻底释放?

下面这几种方法有没有正确的?它们的区别是什么?
1. for (int i=0; i<_assignment_stack.size(); ++i){
delete _assignment_stack[i];
}
2. _assignment_stack.clear();
3. for (int i=0; i<_assignment_stack.size(); ++i){
(*_assignment_stack[i]).clear();
}



...全文
674 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
aflyinghorse 2003-10-16
  • 打赏
  • 举报
回复
Wolf0403(完美废人)的程序有问题,你的程序并没有释放new分配的空间
下面的程序可以证明

#include <iostream>
#include <vector>
using namespace std;
class A
{
public:
A(){cout << "A" << endl;ctor++;}
A(const A&){cout << "copyctor A" << endl;copyctor++;}
~A(){cout << "~A" << endl;dtor++;}
static int ctor;
static int copyctor;
static int dtor;
};
int A::ctor = 0;
int A::copyctor = 0;
int A::dtor = 0;

int main()
{
vector<vector<A> *> v(5);
for (int i = 0; i < 5; i++)
v[i] = new vector<A>(5);
for (int i = 0; i < 5; i++)
delete v[i];
cout << A::ctor << endl;
cout << A::copyctor << endl;
cout << A::dtor << endl;
getchar();
return 0;
}
上面的程序实际上执行了5次构造, 25次拷贝构造, 30次析构
程序的结果显示每次执行new vector<A>(5);时,先生成临时对象A,然后用拷贝构造函数
去初始化vector中的每一个A(调用5次拷贝构造函数), 然后释放临时对象,
这样一次循还才结束。
Cafes 2003-10-16
  • 打赏
  • 举报
回复
多谢热心的各位
小弟受教了
for (int i=0; i<_assignment_stack.size(); ++i){
delete _assignment_stack[i];
}
_assignment_stack.clear();
我还是两条语句都用了
要是只用delete的话 _assignment_stack的size()不会改变...
下次再调用的时候就有错了
用boundcheck查过了
原来这里的泄漏没了
再次感谢大家,这就散分



sevencat 2003-10-16
  • 打赏
  • 举报
回复
手工删除我反而觉得比较安心。
有些自动删除的我老是觉得不放心。
总要测试一下再用。
短歌如风 2003-10-16
  • 打赏
  • 举报
回复
“vector中放指针的话要手工删除”并不能说是缺陷,要知道“无所有权的引用”是存在的。
williamVII 2003-10-16
  • 打赏
  • 举报
回复
vector中放指针的话要手工删除,
这不能不说是一大缺陷.
(详见Thinking in C++ 第二卷 STL部分)
短歌如风 2003-10-15
  • 打赏
  • 举报
回复
使用boost中的shared_ptr好象不需要预先编译的啊?
也可以用Loki,同样不需要编译。

vector是可以存放指针类型的,但它不会负责释放,如果它作了这件事,那一定是错误的实现。通常我都用指针元素类型的容器表示单纯的引用(无所有权的),而用XXX_ptr元素类型的容器表示有所有权的容器。
Wolf0403 2003-10-15
  • 打赏
  • 举报
回复
class A
{
public:
A(){cout << "A" << endl;}
~A(){cout << "~A" << endl;}
};

int main()
{
vector<vector<A> *> v(5);
for (int i = 0; i < 5; i++)
v[i] = new vector<A>(5);
return 0;
}
一共 5 个构造,5 个析构,不需要任何管理。STL 的封装确实好。
vector 填充对象是用的 copy_ctor 所以不能用 auto_ptr。如果不想编译 boost...用我写的那个 Count_Ptr 好了^_^

【广告】
无需编译,直接使用!
详情请见:
http://expert.csdn.net/Expert/TopicView1.asp?id=2346049
【/广告】
sevencat 2003-10-15
  • 打赏
  • 举报
回复
for (int i=0; i<_assignment_stack.size(); ++i){
delete _assignment_stack[i];
}
. _assignment_stack.clear();
for (int i=0; i<_assignment_stack.size(); ++i){
(*_assignment_stack[i]).clear();
}
这里面两种办法都有可能正确的第一种是单纯的删除掉。
而如果是引用计数的话只能用第二种方法。

boost库MSDN是没有的要自己下载自己编译
sevencat 2003-10-15
  • 打赏
  • 举报
回复
我用vector中使用指针好像没什么问题,只不过不能使用智能指针。
不使用指针会带来一个性能问题。
举例
struct nodex
{
int a;
int b;
int c;
int d;
}
我现在要向vector里面新插入一个nodex 你可以想想看你到底准备怎么做。

最简单的一种办法:
nodex a;
a.a=1;
a.b=2;
..
std::nodexvector.insert();
//上面这种写法就是没有效率的一种。
第二种就是先插入一个点然后再赋值。
但要是碰到有些类没有缺省构造函数的我们就无能为力了。
而使用指针这些问题基本上都是可以解决的。
只不过到最后要一个一个的delete 掉才行。
Wolf0403 2003-10-15
  • 打赏
  • 举报
回复
www.boost.org

偶宁愿自己写 some_ptr 也不去编译 boost,嘿嘿。

一直怀疑 vector 中只能存放非指针的类型,但是不确定。用 vector<int *> 跟踪进去 VC7 的 <vector> 坚持了几步就转向了。好像执行了 delete 但是。。。总感觉怪。
Cafes 2003-10-15
  • 打赏
  • 举报
回复
能不能解释一下这个boost::shared_prt是什么意思呢?
改了以后 _assignment_stack.push_back(new vector<int>);这句还能用嘛

我在msdn里面没找到
还有那个boost库我在VC98那个包下面也没有找到...//blush
Darkay_Lee 2003-10-15
  • 打赏
  • 举报
回复
vector<boost:shared_ptr<vector<int> > > _assignment_stack;
应该是:
vector<boost::shared_ptr<vector<int> > > _assignment_stack;
要添加boost库才支持。

短歌如风 2003-10-15
  • 打赏
  • 举报
回复
用方法1。

建议不要在vector中存放指针,改用
vector<boost:shared_ptr<vector<int> > > _assignment_stack;
然后就可以用方法2把内存释放了。
aflyinghorse 2003-10-15
  • 打赏
  • 举报
回复
1正确,用new分配的要用delete来释放
new和delete总是成对出现

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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