现在的位置: 首页 > 综合 > 正文

vector的内存分配行为

2013年05月31日 ⁄ 综合 ⁄ 共 1574字 ⁄ 字号 评论关闭
    1. /* 结论:
    2.     vector的存在可以使开发者不必关心内存的申请和释放。但是,vector背后的内存分配是按照2的倍数分配内存的。当当前容量对插入元素不够时,分配一块新的内存,这块内存的容量是原vector容量的2倍大小,然后复制旧内存,释放旧内存,可能多次涉及拷贝构造函数和析构函数,而这也正是vector的劣势所在。*/

在使用cocos2d-x引擎的时候,多次调用cclayer、ccsprite的析构函数,程序会崩掉。
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. int main()
  5. {
  6.     vector<int> iVec;
  7.     cout << "size: " << iVec.size() << endl;
  8.     cout << "capacity " << iVec.capacity() << endl << endl; //1个元素, 容器容量为1
  9.     iVec.push_back(1);
  10.     cout << "size: " << iVec.size() << endl;
  11.     cout << "capacity " << iVec.capacity() << endl << endl; //2个元素, 容器容量为2
  12.     iVec.push_back(2);
  13.     cout << "size: " << iVec.size() << endl;
  14.     cout << "capacity " << iVec.capacity() << endl << endl; //3个元素, 容器容量为4
  15.     iVec.push_back(3);
  16.     cout << "size: " << iVec.size() << endl;
  17.     cout << "capacity " << iVec.capacity() << endl << endl; //4个元素, 容器容量为4
  18.     iVec.push_back(4);
  19.     iVec.push_back(5);
  20.     cout << "size: " << iVec.size() << endl;
  21.     cout << "capacity " << iVec.capacity() << endl << endl; //5个元素, 容器容量为8
  22.     iVec.push_back(6);
  23.     cout << "size: " << iVec.size() << endl;
  24.     cout << "capacity " << iVec.capacity() << endl << endl; //6个元素, 容器容量为8
  25.     iVec.push_back(7);
  26.     cout << "size: " << iVec.size() << endl;
  27.     cout << "capacity " << iVec.capacity() << endl << endl; //7个元素, 容器容量为8
  28.     iVec.push_back(8);
  29.     cout << "size: " << iVec.size() << endl;
  30.     cout << "capacity " << iVec.capacity() << endl << endl; //8个元素, 容器容量为8
  31.     iVec.push_back(9);
  32.     cout << "size: " << iVec.size() << endl;
  33.     cout << "capacity " << iVec.capacity() << endl << endl; //9个元素, 容器容量为16
  34.     /* 结论:
  35.     vector的存在可以使开发者不必关心内存的申请和释放。但是,vector背后的内存分配是按照2的倍数分配内存的。当当前容量对插入元素不够时,分配一块新的内存,这块内存的容量是原vector容量的2倍大小,然后复制旧内存,释放旧内存,可能多次涉及拷贝构造函数和析构函数,而这也正是vector的劣势所在。*/
  36.     return 0;
  37. }

抱歉!评论已关闭.