gpt4 book ai didi

c++ - std::string 重新分配可以使指向堆的指针无效吗?

转载 作者:太空狗 更新时间:2023-10-29 23:02:25 24 4
gpt4 key购买 nike

我的问题是关于以下场景:

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

根据我的经验,通常发生的情况是 aVeryLargeString 超出了 *ps 的容量,因此 *ps 会分配额外的内存,保持起始位置不变。 所以 ps 仍会指向新字符串,如内存中的位置是相同的。

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

最佳答案

What usually happens from my experience is that aVeryLargeString exceeds the capacity of *ps, so *ps allocates extra memory, keeping the starting position the same.

不,这通常不是真的。当您超过容量时,该字符串使用其分配器分配一个完全不同的 block (大小为先前容量的某个因子),并将字符复制过来。除非您保留对字符串实际字符的指针或引用(例如通过 &(*ps)[0]ps->c_str()),因为与指向字符串对象本身的指针相反(ps 是什么),您不必担心这一点。

So ps will still point to the new string as the location in memory is the same.

ps 不会,也不可能受到对其指向的字符串 (*ps) 的操作以任何方式影响(显然不包括以下操作表现出未定义的行为,这可能会产生任何影响)。

关于c++ - std::string 重新分配可以使指向堆的指针无效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28707107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com