C++ 如何快速清空vector以及释放vector内存?

平时我们在写代码时候,有思考过要主动去释放vector的内存吗?

1、对于数据量不大的vector,没有必要自己主动释放vector,一切都交给操作系统。

2、但是对于大量数据的vector,在vector里面的数据被删除后,主动去释放vector的内存就变得很有必要了!

读者可以新建一个控制台程序,把代码运行起来看输出,且看代码:

[cpp] view plain copy

  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <Windows.h>
  5. #include <Psapi.h>
  6. #pragma comment(lib, "Psapi.lib")
  7. using namespace std;
  8. //GetCurPorcessMemory
  9. bool GetCurProcessMemory(HANDLE handle, std::wstring& workingSize, std::wstring& peakWorkingSize)
  10. {
  11. //HANDLE handle = GetCurrentProcess();
  12. PROCESS_MEMORY_COUNTERS pmc;
  13. if (GetProcessMemoryInfo(handle, &pmc, sizeof(pmc)))
  14. {
  15. int size = pmc.WorkingSetSize/1024;
  16. wchar_t buf[10] = {0};
  17. _ltow(size, buf, 10);
  18. workingSize = std::wstring(buf);
  19. size = pmc.PeakWorkingSetSize/1024;
  20. _ltow(size, buf, 10);
  21. peakWorkingSize = std::wstring(buf);
  22. return true;
  23. }
  24. return false;
  25. }
  26. int _tmain(int argc, _TCHAR* argv[])
  27. {
  28. std::wstring wszWorking, wszPeakWorking;
  29. vector<string> ary;
  30. for (int i=0; i<1000000; i++)
  31. {
  32. ary.push_back("hello vector");
  33. }
  34. wchar_t wch;
  35. wcin >> wch;
  36. GetCurProcessMemory(GetCurrentProcess(), wszWorking, wszPeakWorking);// 此时检查内存情况
  37. wcout << "Working : " << wszWorking.c_str() << " PeakWorking : " << wszPeakWorking.c_str() << endl;
  38. wcin >> wch;
  39. //
  40. ary.clear();
  41. wcout << "vector clear" << endl;
  42. wcout << "vector capacity " << ary.capacity() << endl;
  43. GetCurProcessMemory(GetCurrentProcess(), wszWorking, wszPeakWorking);// 此时再次检查
  44. wcout << "Working : " << wszWorking.c_str() << " PeakWorking : " << wszPeakWorking.c_str() << endl;
  45. wcin >> wch;
  46. //vector<string>(ary).swap(ary);
  47. ary.swap(vector<string>(ary));
  48. wcout << "vector swap" << endl;
  49. wcout << "vector capacity " << ary.capacity() << endl;// 此时容量为0
  50. GetCurProcessMemory(GetCurrentProcess(), wszWorking, wszPeakWorking);// 检查内存
  51. wcout << "Working : " << wszWorking.c_str() << " PeakWorking : " << wszPeakWorking.c_str() << endl;
  52. wcout << "vector size : " << ary.size() << endl;//0
  53. //getchar();
  54. system("pause");
  55. return 0;
  56. }

https://blog.csdn.net/hellokandy/article/details/78500067

原文地址:https://www.cnblogs.com/findumars/p/8732317.html

时间: 2024-10-13 04:47:13

C++ 如何快速清空vector以及释放vector内存?的相关文章

vector 利用swap 函数进行内存的释放 vector&lt;int&gt;().swap

首先,vector与deque不同,其内存占用空间只会增长,不会减小.比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个.所有空间在vector析构时回收. 1.释放内存: empty()是用来检测容器是否为空的,clear()可以清空所有元素.但是即使clear(),所占用的内存空间依然如故.如果你需要空间动态缩小,可以考虑使用deque.如果非要用vector,这里有一个办法: 在<effective STL>和其实

没有躲过的坑--正确释放vector的内存

vector的内存会不会泄露? 即使不泄露,怎么能缩小所占空间呢? 我们知道vector有个clear()方法? 原型: #include <vector> void clear(); 函数clear()删除储存在vector中的所有元素. 如果vector的元素是一些object, 则它将为当前储存的每个元素调用它们各自的析构函数(destructor). 然而, 如果vector储存的是指向对象的指针, 此函数并不会调用到对应的析构函数. 在第二种情况下, 为了完全删除vector中的元素

Vector::Vector的定义

typedef int Rank; //秩 #define DEFAULT_CAPACITY 3 //默认的初始容量(实际应用中可设置为更大) template <typename T> class Vector { //向量模板类 protected: Rank _size; int _capacity; T* _elem; //规模.容量.数据区 void copyFrom(T const * A, Rank lo, Rank hi); //复制数组区间A[lo, hi) void exp

error LNK2005: “public: class std::vector&lt;class std::vector&lt;class std::vector&lt;float&gt;”

VS2010:error LNK2005: "public: class std::vector<class std::vector<class std::vector<class std::vector<float,class std::allocator<float> >,class std::allocator<class std::vector<float,class std::allocator<float> 如: Re

linux几种快速清空文件内容的方法

linux几种快速清空文件内容的方法 几种快速清空文件内容的方法: $ : > filename #其中的 : 是一个占位符, 不产生任何输出. $ > filename $ echo "" > filename $ echo /dev/null > filename $ echo > filename $ cat /dev/null > filename

vector(char*)和vector(string)

vector<char*> ch; vector<string> str; for(int i=0;i<5;i++) { char *c=fun1();//通过这个语句产生不同的字符串c ch.push_back(c);  //输出发现,五个都是一样的数值,都是最后一个c的值 str.push_back(c);  //正确的存储了 }

java.util.vector中的vector的详细用法

ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.util.*; /** * 演示Vector的使用.包括Vector的创建.向Vector中添加元素.从Vector中删除元素. * 统计Vector中元素的个数和遍历Vector中的元素. */ public class VectorDemo{ public static void main(String[] args){ //Vector的创建 //使用Vector

转载关于reset vector 和 exception vector

在NIOS II学习过程中设置CPU参数的时候,遇到Reset Vector和Exception Vector的设置.参数设置画面如下图所示. Reset Vector——复位向量Exception Vector——执行向量首先说明两个向量地址都存储着程序.下面分别进行解释.                                        Reset Vector——复位向量当FPGA进行复位时,FPGA就重新开始执行重新,这是就需要从EPCS中读取程序.由于FPGA的程序存放在E

linux快速清空文件 比如log日志

linux中快速清空文件内容的几种方法这篇文章主要介绍了linux中快速清空文件内容的几种方法,需要的朋友可以参考下 权限要求: 至少执行用户对该文件有写的权限 --w------- 1 QA_Deploy QA_Deploy       1 Jun 27 17:35 test.out $ : > filename $ > filename $ echo "" > filename $ echo > filename 是不是第二种最简单,直接> filen