我的问题是关于以下情况:
std::string *ps = new std::string();
*ps = aVeryLargeString;
根据我的经验,通常会发生aVeryLargeString超过* ps的容量,所以* ps分配额外的内存,保持起始位置不变。所以ps仍然指向新的字符串为内存中的位置是一样的。
但是,如果该内存位置没有足够的连续空间会发生什么?重新分配是否将字符串移动到完全不同的位置,从而使指针无效?
答案 0 :(得分:1)
根据我的经验,通常会发生的是aVeryLargeString 超过* ps的容量,所以* ps分配额外的内存,保持 起始位置相同。
不,这通常不正确。超过容量时,字符串使用其分配器分配一个完全不同的块(大小与先前容量相当),并复制字符。除非你保持指向或引用字符串的实际字符(例如通过&(*ps)[0]
或ps->c_str()
),而不是指向字符串对象本身的指针(这是ps
是的,你不必担心这个。
因此ps仍将指向新字符串作为内存中的位置 同样的。
ps
不会,也不会受到它所指向的字符串操作的任何影响(*ps
)(显然排除了表现出未定义行为的操作,可能有任何影响)。