std :: string重新分配可以使指针无效吗?

时间:2015-02-24 21:55:35

标签: c++ string pointers heap invalidation

我的问题是关于以下情况:

std::string *ps = new std::string();
*ps = aVeryLargeString;

根据我的经验,通常会发生aVeryLargeString超过* ps的容量,所以* ps分配额外的内存,保持起始位置不变。所以ps仍然指向新的字符串为内存中的位置是一样的。

但是,如果该内存位置没有足够的连续空间会发生什么?重新分配是否将字符串移动到完全不同的位置,从而使指针无效?

1 个答案:

答案 0 :(得分:1)

  

根据我的经验,通常会发生的是aVeryLargeString   超过* ps的容量,所以* ps分配额外的内存,保持   起始位置相同。

不,这通常不正确。超过容量时,字符串使用其分配器分配一个完全不同的块(大小与先前容量相当),并复制字符。除非你保持指向或引用字符串的实际字符(例如通过&(*ps)[0]ps->c_str()),而不是指向字符串对象本身的指针(这是ps是的,你不必担心这个。

  

因此ps仍将指向新字符串作为内存中的位置   同样的。

ps不会,也不会受到它所指向的字符串操作的任何影响(*ps)(显然排除了表现出未定义行为的操作,可能有任何影响)。