我的问题围绕复制构造和重新分配的机制。
我有一堂课,收集字符串。将字符串添加到集合后,该字符串将被复制并存储在向量中。但因为我还需要访问所有字符串的集合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());
}
}
我知道,存储指向向量元素的指针是不好的,因为当向量调整大小时,即必须重新分配其内存时,这些指针将不再有效。
但我只存储指向数据的指针。所以这就是我的想法:
If names
调整大小后,它将移动构造它包含的所有字符串,因此这些字符串不会分配新的内存,而是仅使用已分配的内存,因此我的指针cStringPointers
仍然有效。
我现在的问题很简单:我是否错过了一些会使该代码不安全或导致未定义行为的东西?
(假设我不使用任何奇特的架构和/或编译器。)
我现在的问题很简单:我是否错过了一些可以让
这段代码不安全或导致未定义的行为?
是的:您错过了小字符串优化。它是标准允许的并被广泛实施,并且会导致悬空指针作为字符串actually将他们的数据移动到新位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)