中易网

vector内存释放 c++

答案:4  悬赏:30  
解决时间 2021-03-07 11:42
main()
{
vector<double>it;
double a[100000];
for(int i=0;i<100000;i++)
{
a[i]=i;
}
for(int i=0;i<100000;i++)
{
it.push_back(a[i]);
}
return 0;
}

在 for(int i=0;i<100000;i++)
{
it.push_back(a[i]);
}
之后我如何做 才能让程序占用内存和在这段循环之前的一样多呢?
最佳答案
光clear是不释放内存的,将你这段代码修改了一下,你看看,应该能明白了,不明白运行一下就知道了。

#include <vector>
#include <iostream>
using namespace std;
main()
{
vector<double>it;
double a[100000];
for(int i=0;i<100000;i++)
{
a[i]=i;
}
cout << "未放元素时容器大小为: " << it.size() << "容器容量为: " << it.capacity() << endl; //未放元素
for(int i=0;i<100000;i++)
{
it.push_back(a[i]);
}
cout << "放元素后容器大小为: " << it.size() << "容器容量为: " << it.capacity() << endl; //放元素
it.clear();
cout << "clear后容器大小为: " << it.size() << "容器容量为: " << it.capacity() << endl; //clear
vector<double>().swap(it);
cout << "swap后容器大小为: " << it.size() << "容器容量为: " << it.capacity() << endl; //swap

return 0;
}

运行结果:

未放元素时容器大小为: 0容器容量为: 0
放元素后容器大小为: 100000容器容量为: 131072
clear后容器大小为: 0容器容量为: 131072
swap后容器大小为: 0容器容量为: 0
全部回答
it.clear(); 把里面的元素删掉,内存就还回去了 如果你是想把数组的内存还回去,你开始的时候就 double* a = new double[100000]; 然后delete a[];
couvluzkst7224804053mppwvspoit0628606864很不错哦,你可以试下 zbxceeymwq58314184782011-12-23 下午 10:01:44 楼主的程序可以编译运行。 确实,楼主的程序隐含存在一个问题--内存泄露。具体原因分析如下: 1、类Vector在类定义中存在一个整型指针成员buffer,这个指针成员在类的构造函数中被动态分配内存,但是,在该类的析构函数定义中未将指针内存释放,因此存在内存泄露。 2、如何解决内存泄露的问题呢?一个简单的方法是在类Vector的析构函数中添加指针内存释放指令,比如: ~Vector(){cout<<"Descontructing \n";if (buffer != (int *)NULL) delete buffer; } 但是,这样一来,程序反而运行失败。可以看到,程序中有这样的指令 Vector b(a); // 在对象b创建时,将对象a赋值给对象b 执行完这条指令以后,对象b拥有与对象a相同的数据成员,包括指针buffer,即b.buffer与a.buffer的指针值完全相同。当程序执行完最后一条指令退出时,对象a和b都自动调用析构函数,于是同一块内存(由a.buffer和b.buffer共同指向的动态内存)就被释放两次,程序运行失败。同时,也注意到,上述分析证明了程序演示的结果,即当执行上述指令之后,b.disp()还能够输出a.set()的结果。 3、如何解决动态内存两次释放的问题呢?应用到拷贝构造函数,比如如下定义: Vector::Vector(Vector &obj) { if (obj.buffer != (int *)NULL) { size = obj.size; buffer = new int[size]; memcpy(buffer, obj.buffer, sizeof(int)*size); } else { buffer = (int *)NULL; } } 这样的话,当执行指令 Vector b(a); 时,调用该类的拷贝构造函数来进行赋值。可以看到,此时b.buffer与a.buffer指向了不同的内存块,然而这两个内存块中包含相同的内容,真正做到了安全赋值的作用。
光clear是不释放内存的,将你这段代码修改了一下,你看看,应该能明白了,不明白运行一下就知道了。 #include &lt;vector&gt; #include &lt;iostream&gt; using namespace std; main() { vector&lt;double&gt;it; double a[100000]; for(int i=0;i&lt;100000;i++) { a[i]=i; } cout &lt;&lt; "未放元素时容器大小为: " &lt;&lt; it.size() &lt;&lt; "容器容量为: " &lt;&lt; it.capacity() &lt;&lt; endl; //未放元素 for(int i=0;i&lt;100000;i++) { it.push_back(a[i]); } cout &lt;&lt; "放元素后容器大小为: " &lt;&lt; it.size() &lt;&lt; "容器容量为: " &lt;&lt; it.capacity() &lt;&lt; endl; //放元素 it.clear(); cout &lt;&lt; "clear后容器大小为: " &lt;&lt; it.size() &lt;&lt; "容器容量为: " &lt;&lt; it.capacity() &lt;&lt; endl; //clear vector&lt;double&gt;().swap(it); cout &lt;&lt; "swap后容器大小为: " &lt;&lt; it.size() &lt;&lt; "容器容量为: " &lt;&lt; it.capacity() &lt;&lt; endl; //swap return 0; } 运行结果: 未放元素时容器大小为: 0容器容量为: 0 放元素后容器大小为: 100000容器容量为: 131072 clear后容器大小为: 0容器容量为: 131072 swap后容器大小为: 0容器容量为: 0
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
珠海市胜牌汽车护理部这个地址在什么地方,我
图中数学为何错,正解
帮忙解决一个带莲的和一带利的网名
找规律:22,35,56,90,()145
老公家暴后我也还手了,如果离婚,会怎判?
创业东路/盛扬大桥(路口)在哪里啊,我有事要
冰冻饺子要蒸多长时间
首次缴税需先交3个月的税吗
双鱼座喜欢一个人会有哪些表现?
高榜山的介绍
君子报仇,见你发愁啥意思
男性无偿献血12小时后可以同房吗?
名词的重音是在第一个音节吗?
I am comeing!和I am coming有区别嘛
股票上的一行短杠,没有数字显示是什么意思
推荐资讯
孕妇可以喝伊利女士高铁高钙奶粉吗
下埔路/北四街(路口)在哪里啊,我有事要去这
襄阳恒大名都购房能用公积金代款吗
金帝集成灶无烟厨房生活体验馆在哪里啊,我有
找规律: 4,8,12,16,20......第N项是什么?
有一根20cm长的铁丝,用它围成一个有一组对边
百汇快捷宾馆在什么地方啊,我要过去处理事情
海宁市环境保护监测站地址有知道的么?有点事
仙龙壁纸怎么去啊,有知道地址的么
电动车九九电池好吗?
三星gt一|90o3多少钱
找一部关于撒旦的电影
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?