C++ vector内存分配及正确释放

C++ vector内存分配及正确释放_vector 释放-CSDN博客

内存分配

#include <iostream>
#include <vector>
using namespace std;int  main(){
vector<int> vec(10);
cout << "vec.size: "<< vec.size() <<endl;
cout << "vec.capacity;"<< vec.capacity()<<endl;
vec.push_back(1);
cout << "vec.size: "<< vec.size() <<endl;
cout << "vec.capacity:"<< vec.capacity()<<endl;}

运行结果如图:

需要内存释放的场景

#include <iostream>
#include <vector>
using namespace std;void myFunc() {vector<int> vec(1000000, 123);
}int main() {myFunc();return 0;
}

#include <iostream>
#include <vector>
using namespace std; int main() {vector<int>* vec = new vector<int>(1000000, 123);vector<int>().swap(*vec);cout << "After swap - size: " << vec->size() << ", capacity: " << vec->capacity() << endl;delete vec;return 0;
}

#include <iostream>
#include <memory>
#include <vector>
using namespace std;int main() {unique_ptr<vector<int>> vec(new vector<int>(1000000, 123));  cout << "vec size: " << vec->size() << ", capacity: " << vec->capacity() << endl;cout << "离开作用域后,vec自动销毁,不需要swap释放内存" << endl;return 0;
}

内存释放

#include <iostream>
#include <vector>
using namespace std;int main(){vector<int> vec;//手动空间100 vec.reserve(100);vec.push_back(1);vec.push_back(2);cout <<"vec.size(): " << vec.size() << endl;cout <<"vec.capasity(): " << vec.capacity() << endl;vec.clear();cout <<"After vec.size(): " << vec.size() << endl;cout <<" After vec.capasity(): " << vec.capacity() << endl;return 0;
}  

#include <iostream>
#include <vector>
using namespace std;int main(){vector<int> vec;//手动空间100 vec.reserve(100);vec.push_back(1);vec.push_back(2);cout <<"vec.size(): " << vec.size() << endl;cout <<"vec.capasity(): " << vec.capacity() << endl;vec.clear();vec.shrink_to_fit();cout <<"After vec.size(): " << vec.size() << endl;cout <<"After vec.capasity(): " << vec.capacity() << endl;return 0;
}  

#include <iostream>
#include <vector>
using namespace std;int main(){vector<int> vec;//手动空间100 vec.reserve(100);vec.push_back(1);vec.push_back(2);cout <<"vec.size(): " << vec.size() << endl;cout <<"vec.capasity(): " << vec.capacity() << endl;vector<int> ().swap(vec);cout <<"After vec.size(): " << vec.size() << endl;cout <<"After vec.capasity(): " << vec.capacity() << endl;return 0;
}  

#include <iostream>
#include <vector>
using namespace std;int main(){vector<vector<int>> vec;vec.push_back({1,2});vec.push_back({4,5,6});vec.push_back({7,8,9});cout<<"vec outer size: "<<vec.size()<<endl;for(const auto& i: vec){cout <<"vec vinner size: "<<vec.size() <<" , vec inner capacity: "<<i.capacity()<<endl;}//释放内层for(auto& i :vec){i.clear();i.shrink_to_fit();} //释放外层vec.clear();vec.shrink_to_fit();cout<<"after releasing vec outer size: "<<vec.size()<<endl;
} 
方法二:逐层采用swap释放
#include <iostream>
#include <vector>
using namespace std;int main(){vector<vector<int>> vec;vec.push_back({1,2});vec.push_back({4,5,6});vec.push_back({7,8,9});cout<<"vec outer size: "<<vec.size()<<endl;for(const auto& i: vec){cout <<"vec vinner size: "<<vec.size() <<" , vec inner capacity: "<<i.capacity()<<endl;}//释放内层for(auto& i :vec){vector<int>().swap(i);} //释放外层 vector<vector<int>>().swap(vec);cout<<"after releasing vec outer size: "<<vec.size()<<endl;
} 
方法三:重新分配,销毁整个双层vector释放
#include <iostream>
#include <vector>
using namespace std;int main(){vector<vector<int>> vec;vec.push_back({1,2});vec.push_back({4,5,6});vec.push_back({7,8,9});cout<<"vec outer size: "<<vec.size()<<endl;for(const auto& i: vec){cout <<"vec vinner size: "<<vec.size() <<" , vec inner capacity: "<<i.capacity()<<endl;}vector<std::vector<int>>().swap(vec);cout<<"after releasing vec outer size: "<<vec.size()<<endl;
} 

#include <iostream>
#include <vector>
using namespace std;void res(const vector<vector<vector<int>>>& tmp) {cout << "最外层 vector size: " << tmp.size() << endl;for (const auto& i : tmp) {cout << "\中间层 vector size: " << i.size() << endl;for (const auto& j : i) {cout << "\t\t最内层 vector size: " << j.size() << endl;}}
}int main() {vector<vector<vector<int>>> vec;for (int i = 0; i < 3; ++i) {vector<vector<int>> vec1;for (int j = 0; j < 2; ++j) {vector<int> vec2;for (int k = 0; k < 4; ++k) {vec2.push_back(i * 100 + j * 10 + k);}vec1.push_back(vec2);}vec.push_back(vec1);}//三层veccout << "-----初始vec-----" << endl;res(vec);for (auto& vec1 : vec) {for (auto& vec2 : vec1) {vector<int>().swap(vec2);  // 释放最深层}vector<vector<int>>().swap(vec1);  // 释放中间层}vector<vector<vector<int>>>().swap(vec);  // 释放最外层// 打印释放内存后的向量信息cout << "\n-----释放后vec-----" << endl;res(vec);  // 中间层和最内层不会输出,因为内存已经被释放,编译器可能报错return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/611194.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring.rabbitmq.listener.simple.default-requeue-rejected = false 和放入死信队列的区别

目录 一、场景 二、使用 spring.rabbitmq.listener.simple.default-requeue-rejected false 2.1 特点 三、 放入死信队列 四、两种区别 一、场景 当我们使用RabbitMq的时候&#xff0c;我们如果业务中有异常&#xff0c;很有可能造成死循环&#xff0c;因为 在RabbitMQ和…

OJ刷题日记:1、双指针(1)

目录 1、283.移动零 2、1089.复写零 3、202.快乐数 1、283.移动零 题目&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 …

mysql重启失败

服务器重启了一下&#xff0c;然后启动后发现mysql自动启动没有生效&#xff0c;于是手动通过systemctl启动mysqld&#xff0c;然后就报错:Starting MySQL...........The server quit without updating P[FAILED](/data/mysql/iz2zebvmy1qv3fao9c5riuz.pid). 根据配置my.cnf文…

Mysql内存表及使用场景(12/16)

内存表&#xff08;Memory引擎&#xff09; InnoDB引擎使用B树作为主键索引&#xff0c;数据按照索引顺序存储&#xff0c;称为索引组织表&#xff08;Index Organized Table&#xff09;。 Memory引擎的数据和索引分开存储&#xff0c;数据以数组形式存放&#xff0c;主键索…

Jmeter-跨线程传参(正则提取多个参数、jsonpath提取器)

目的&#xff1a; 当前接口请求的参数依赖于其他请求&#xff0c;且两个请求不是在同一个线程组时就会用到该方法进行跨线程组传参。 实际使用场景&#xff1a; 多个线程组的请求都依赖登录接口&#xff0c;但是登录接口仅执行一次。 实现方法&#xff1a; 以下举例的有正…

信息系统项目管理师——第22章组织通用治理

本章在第三版战略管理的基础上新增了2节内容&#xff0c;从2023年上半年的考情来看来 选择题&#xff0c;考1分左右&#xff0c;知识点比较分散&#xff0c;刷下题&#xff0c;考前突击下即可。 案例题&#xff0c;不考。 论文题&#xff0c;不考。 1组织战略 组织战略体现了…

电力综合自动化系统对电力储能技术的影响有哪些?

电力综合自动化系统对电力储能技术的影响主要体现在以下几个方面&#xff1a; 提高能源利用效率&#xff1a;电力综合自动化系统通过优化调度和能量管理&#xff0c;可以实现储能设备的有效利用&#xff0c;提高能源利用效率。在电力系统中&#xff0c;储能设备可以有效地平抑风…

Web App 入门指南:构建预测模型 App 的利器(shiny)

Web App 入门指南&#xff1a;构建预测模型 App 的利器 简介 近年来&#xff0c;随着机器学习和人工智能技术的快速发展&#xff0c;预测模型在各行各业得到了广泛应用。为了方便地部署和使用预测模型&#xff0c;将模型构建成 Web App 是一种非常好的选择。Web App 无需下载…

StylizedGS: Controllable Stylization for 3D Gaussian Splatting

StylizedGS: Controllable Stylization for 3D Gaussian Splatting StylizedGS&#xff1a;3D高斯溅射的可控样式化 Dingxi Zhang, Zhuoxun Chen, Yu-Jie Yuan, Fang-Lue Zhang, Zhenliang He, Shiguang Shan, and Lin Gao1 张定西&#xff0c;陈卓勋&#xff0c;袁玉洁&#x…

大日志精选案例七:徐州公交集团数字化转型中的日志审计优化实践

**> “城市公共交通作为民生重要基础设施&#xff0c;其安全与效率至关重要。聚铭的大日志方案&#xff0c;如同为公交系统装上了‘智慧眼’&#xff0c;提供了全方位的日志可见性&#xff0c;使我们能够全面、深入地了解公交系统的运行状况。日志中详细记录的各项操作、事件…

服务器感染了.rmallox勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 随着网络技术的发展&#xff0c;勒索病毒已经成为当今数字时代的一大威胁。近期出现的.rmallox勒索病毒更是引发了广泛关注。本文将深入探讨.rmallox勒索病毒的特点&#xff0c;并提供一系列应对这一威胁的高效策略。如果受感染的数据确实有恢复的价值与必要…

libVLC 视频界面分割

先看看分割后的界面吧&#xff0c;根据分割的数量&#xff0c;来分割视频画面。 其实视频界面分割很简单&#xff0c;看过叠加窗口的这篇文章&#xff0c;不难理解&#xff0c;如何分割。 libVLC 视频窗口上叠加透明窗口-CSDN博客 如果还是不懂的话&#xff0c;我讲解一下原理…