首页 新闻 赞助 找找看

关于c++的vector内存分配的问题

0
[已解决问题] 解决于 2015-04-20 21:19

假如vector中存放100个string(不是指针类型string*,而是string),那么如果vector中的一个string重新分配空间,会不会造成整个vector重新分配空间呢?假如代码如下:
vector<string> *v1 = new vector<string>(100);
v1[20].append("abc");
假设最后一句使v1[20]字符串超出原分配空间,根据string类型的算法,这个字符串会重新分配空间并复制数据,因为它属于v1的,而v1中的元素必须是连续的,所以是不是它也将会造成整个v1重新分配空间并复制数据呢?

Patrickz10的主页 Patrickz10 | 初学一级 | 园豆:7
提问于:2015-04-20 09:23
< >
分享
最佳答案
0

基础知识不扎实啊!

数组元素的大小(sizeof(std::string))是固定的,不能更改,这是数组的基本属性。你把元素自身管理的内存同容器管理的内存搞混淆了。

 

std::string& str = v1[20];

str.append("abc");  // 你想想,有什么机制能让 str 将重新分配字符串空间的操作通知或委托给 std::vector<std::string>> 来执行?办不到,所以,这里的内存分配是 std::string 自身的行为,跟 std::vector 无关。

 

按照你的举例,我也举一个:

std::vecotr<std::vector<int>> v1(100);

v1[20].resize(200);

 

 

奖励园豆:5
Launcher | 高人七级 |园豆:45045 | 2015-04-20 10:10

你不觉得很奇怪吗?如果vector<string>中的元素是string,那么当某个元素超出它预先分配空间,它是要重新分配大小为原来2倍的空间的,而且我们知道vector内部元素的存放也是连续的,那这个新的字符串放哪里去?但是实验的结果竟然是string地址不变,哪说明vector是存放string*吗?但我们声明是vector<string>而不是vector<string*>啊?难道vector<string>中的元素是存放string*(字符串指针)而不是string吗?那说明vector这个模板竟然还会根据模板参数的类型进行不同编译啊?

Patrickz10 | 园豆:7 (初学一级) | 2015-04-20 12:12

@Patrickz10: 不奇怪,奇怪是因为你基础差啊!你看下 string 的源码,看下拷贝构造函数的实现。你是不是从 C# 转过来的?

Launcher | 园豆:45045 (高人七级) | 2015-04-20 12:37

@Patrickz10: 

std::string str1;

std::string str2="abcdfdfdddddddddddddddddddddddddddddddddddsfsdfdsf";

sizeof(str1) 等于 sizeof(str2) 不?

Launcher | 园豆:45045 (高人七级) | 2015-04-20 12:42

@Launcher: 对,看来string类中对字符串数据存放的是字符数组的指针了,这样就能解释过去,我本来以为是直接存放字符数组,才有上面那个疑问。vecotr<int>中也应该是存放int数组的指针,而不是直接声明数组本身,这样它们的数据成员空间再分配时就不会影响原来对象的地址。粗读了STL源码,应该是这样,对吧?要仔细研究暂时没有时间,那些是内部实现机制,可能只对高手来说才是基础吧?呵呵

Patrickz10 | 园豆:7 (初学一级) | 2015-04-20 20:50

@Launcher: 我没有分送了,送完了,只能说谢谢你

Patrickz10 | 园豆:7 (初学一级) | 2015-04-20 21:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册