【发布时间】:2019-08-30 09:22:27
【问题描述】:
我的问题围绕着复制构造和重新分配的机制。
我有一个收集字符串的类。将字符串添加到集合后,该字符串被复制并存储在向量中。但由于我还需要以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());
}
}
我知道,存储指向向量元素的指针是不好的,因为当向量被调整大小时,即必须重新分配他的内存,这些指针将不再有效。
但我只存储指向数据的指针。所以这是我的想法:
如果names 被调整大小,它将移动构造它包含的所有字符串,因此这些字符串不会分配新内存,而是只使用已经分配的内存,所以我在cStringPointers 中的指针仍然有效.
我现在的问题很简单:我是否遗漏了一些会使此代码不安全或导致未定义行为的东西?
(假设我不使用任何奇特的架构和/或编译器。)
【问题讨论】:
-
为什么将它们与字符串分开存储?相反,您可以在需要时致电
c_str -
@foreknownas_463035818 我相信 OP 出于某种原因需要一个指针数组(例如,要传递给某个 C 函数)。
-
你提前知道记录(名字)的数量吗?如果是,您可以为
names预留空间,然后就不会发生重新分配。另一种选择是检查重新分配(比较names的大小和容量),如果发生,重建整个数组cStringPointers。 -
是的,@DanielLangr 是对的,我需要一些 C 接口,更具体地用于 Vulkan,因为它需要扩展名和层名作为 const char * const*。
标签: c++