gpt4 book ai didi

c++ - 存储指向 std::string 数据的指针是否安全?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:12 27 4
gpt4 key购买 nike

我的问题围绕复制构建和重新分配的机制。

我有一个收集字符串的类。将字符串添加到集合后,该字符串被复制并存储在 vector 中。但由于我还需要访问所有字符串的集合作为 const char * const*,我还通过 .c_str() 存储指向每个字符串数据的指针.

class MyStrings {
private:
std::vector<std::string> names;
std::vector<const char*> cStringPointers;
public:
const char *const *Data() const
{
return this->cStringPointers.data();
}

void Add(const std::string &name)
{
// copy [name] and store the copy in [this->names].
this->names.push_back(name);
// Store the pointer to the data of the copy.
this->cStringPointers.push_back(this->names.back().c_str());
}
}

我知道,存储指向 vector 元素的指针是不好的,因为当 vector 被调整大小时,即必须重新分配他的内存,那些指针将不再有效。

但我只存储指向数据的指针。所以这是我的想法:

如果 names 调整大小,它将移动构造它包含的所有字符串,因此这些字符串不会分配新内存,而是只使用已经分配的内存,所以我在 cStringPointers 仍然有效。

我现在的问题很简单:我是否遗漏了一些会使这段代码不安全或导致未定义行为的东西?

(假设我不使用任何异国情调的架构和/或编译器。)

最佳答案

My question is now simply: Have I missed something that would make this code unsafe or cause undefined behaviour?

是的:您错过了小字符串优化。这是标准允许并广泛实现的,并且会导致悬空指针,因为字符串实际上将它们的数据移动到它们的新位置。

关于c++ - 存储指向 std::string 数据的指针是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57723963/

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