Vector() 内存释放 不得不说的故事

                                      **Vector()  内存释放的问题**

原始文章转载来自于: https://blog.csdn.net/yujunan/article/details/8467776

故事的原委:

在传统的C++ 中 , 多维数组的 内存释放是一个很严重的问题。
根据各种查找的资料, 如果要使用delete 需要前提使用new 分配空间。

我们定义的数据类型如下:

vector<cv::String> Filenames;               // 这两个变量如果定义在函数内部,会引起报错。定义为全局函数就突然好了,这个注释一只对了一半,就算定义为全局,一开始也没解决问题
vector<cv::String> Filenames_Remove;           

可以理解为多维数组。

我们知道vector有个clear()方法
原型:
#include
void clear();

函数clear()删除储存在vector中的所有元素. 如果vector的元素是一些object, 则它将为当前储存的每个元素调用它们各自的析构函数(destructor). 然而, 如果vector储存的是指向对象的指针, 此函数并不会调用到对应的析构函数. 在第二种情况下, 为了完全删除vector中的元素则应使用一个类似于下的循环:

std::vector<SomeObject*> aVector;
//The elements of the vector are created with the operand ‘new’ at some point in the program
[…]
for(int i=0 ; i<aVector.size() ; i++)
delete aVector[i];
aVector.clear();

调用clear之后, vector的尺寸(size)将变成zero. 但它的容量(capacity)却并不发生变化, vector本身并不释放任何内存.
如果你想同时做到清空vector的元素和释放vector的容量, 你可以使用swap技巧。
这样做会创建一个临时的空vector, 它将替换希望清空的vector。

“vector 的 clear 不影响 capacity , 你应该 swap 一个空的 vector。”

vector(v).swap(v);

//对于string则可能像下面这样
string(s).swap(s);

即先创建一个临时拷贝与原先的vector一致,值得注意的是,此时的拷贝 其容量是尽可能小的符合所需数据的。紧接着将该拷贝与原先的vector v进行 交换。好了此时,执行交换后,临时变量会被销毁,内存得到释放。此时的v即为原先 的临时拷贝,而交换后的临时拷贝则为容量非常大的vector(不过已经被销毁)
————————————————
为了证明这一点,原作者写了一个程序,如下:
#include
#include
using namespace std;
vector v;
char ch;

int main()
{

for (int i = 0; i<1000000; i++)
    v.push_back("hello vector");
cin >> ch;

// 此时检查内存情况 占用54M

v.clear();
cin >> ch;

// 此时再次检查, 仍然占用54M

cout << "Vector 的 容量为" << v.capacity() << endl;

// 时容量为 1048576

vector<string>(v).swap(v);
cout << "Vector 的 容量为" << v.capacity() << endl;
// 此时容量为0
cin >> ch;
// 检查内存,释放了 10M+ 即为数据内存
return 0;

}

总结:
在UE4 的C++ 中,如果要释放多维Vector ,需要进行两步。

1, Filenames_Remove.clear(); 现将数组的每一个元素清除。
2, vectorcv::String(Filenames_Remove).swap(Filenames_Remove);

经过测试,这两步骤 一定要按照这样的顺利来, 不管是单独的调用任何一个都会出现问题。两个一定要搭配使用。
…建刚分割线…

你以为故事到这里就结束了吗? NO, 太天真了。 以上的套路只针对 纯C++ 平台是没问题的。一但在UE4 的C++ 平台,以上的方法还是会不稳定的出现报错,各种退出时中断。

为了解决根本问题,我们直接走另外一条路。 在UE4 平台的函数体系下 重新实现此功能。请听下回分解。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值