【c++】47.释放vector容器内存std::vector<int>().swap(vct),clear()函数并不能释放内存数据

#include <vector>
#include <iostream>
int main(void) {
    
    
  std::vector<int> vct;
  vct.push_back(99);
  vct.push_back(88);
  vct.push_back(77);
  
  vct.clear();
  
  std::cout << "vct[0]=" << vct[0] << std::endl;
  return 0;
}

g++ -std=c++11 test.cpp -o test
./test输出结果如下截图:
在这里插入图片描述

vct.clear();明明已经清空了vector容器中的元素,但是还是会访问到[0]的值。
这是因为,申请的vector的所有空间在vector析构时才会回收。

如果clear()后再push_back():

  std::vector<int> vct;
  vct.push_back(99);
  vct.push_back(88);
  vct.push_back(77);
  vct.clear();

  vct.push_back(333);
  vct.push_back(222);
  vct.push_back(111);
  std::cout << "vct[0]=" << vct[0] << std::endl;

结果如下图:
在这里插入图片描述
说明,vct.clear();后再push_back()的元素会重新占据[0]及后面的内存空间。


重点来了:

这里推荐使用如下swap()方法清空vector容器的数据:

std::vector<int>().swap(vct);

使用上面这句代码替换vct.clear();后,运行程序,结果如下截图:
在这里插入图片描述
出现段错误,访问vct[0]越界了,因为此时vct中已经没有元素了。

原理就是:用swap()vct交换到一个新的vector容器,将原来的vct拷贝出去,然后自然销毁,而交换后的vct是由std::vector<int>()新创建的空的vector容器,他是全新的、没有存任何数据的。

注意:swap()不是交换两个vector容器的地址,而是交换内容,重要的是他们会改变各自的capacity()size()

int main(void) {
    
    
  std::vector<int> v1;
  v1.push_back(99);
  v1.push_back(88);
  v1.push_back(77);

  std::vector<int> v2;
  v2.push_back(123);
  v2.push_back(456);

  std::cout << "v1的容量:" << v1.capacity() << std::endl;
  std::cout << "v1的大小:" << v1.size() << std::endl << std::endl;

  std::cout << "v2的容量:" << v2.capacity() << std::endl;
  std::cout << "v2的大小:" << v2.size() << std::endl << std::endl;

  v2.swap(v1);
  std::cout << "v1,v2 swap交换后:" << std::endl << std::endl;

  std::cout << "v1的容量:" << v1.capacity() << std::endl;
  std::cout << "v1的大小:" << v1.size() << std::endl << std::endl;

  std::cout << "v2的容量:" << v2.capacity() << std::endl;
  std::cout << "v2的大小:" << v2.size() << std::endl;

  // std::cout << "vct[0]=" << vct[0] << std::endl;
  return 0;
}

结果如下截图:
在这里插入图片描述
因此,使用std::vector<int>()新创建的空的vector容器,他的size()capacity()都为0,v1和空容器交换后,就相当于释放了v1的内存。
更详细的讲解可以参考博客:
std::vector中swap()函数使用解析以及去重复操作
C++ vector容器的swap方法(容器互换)

Guess you like

Origin blog.csdn.net/u011754972/article/details/121404812