您可以在 C++ 中动态分配带有向量作为字段的类吗?
Posted
技术标签:
【中文标题】您可以在 C++ 中动态分配带有向量作为字段的类吗?【英文标题】:Can you dynamically allocate a class with a vector as a field in C++? 【发布时间】:2021-07-23 16:43:33 【问题描述】:我在动态分配的对象中有一个向量。像这样:
class VectorUser
vector<int> v;
//other stuff
;
//somewhere
VectorUser * vu = new VectorUser();
delete vu;
这段代码安全吗?如果是这样,当向量的大小可以是任意值时,c++ 如何知道要分配多少内存?
【问题讨论】:
代码正确。std::vector
具有固定大小(主要是 3 个成员:数据、大小、容量(指针(最后一个可能是整数类型)))(对数据进行额外分配)。
@Jarod42 啊,所以向量对象只存储了一个实际数据的指针。这清除了它。谢谢。
考虑一下,如果这会有问题(出于您认为的原因),那么函数 void foo(std::vector<int> x)
也会有问题
一般情况下,所有相同类型对象的二进制表示具有相同的大小(可通过sizeof
运算符实现)。 std::vector<int>
对象的二进制表示不包含任何向量元素*。它通常只包含一个指向堆上动态分配存储的指针,其中存储了元素。 (*) 这在理论上可以通过 小缓冲区优化 技术实现,但 std::vector
不允许这样做。还有其他实现它的向量实现(例如boost::container::small_vector
)。
【参考方案1】:
vector<foo>
由两部分组成:一个由指针和元素计数组成的固定大小的块,以及指针指向的可变大小的块。当你创建一个新的vector<foo>
时,它不包含foo
s;元素的计数为零,并且指针(取决于实现)可能为空。当您销毁向量时(当您删除 vu
时会发生这种情况),它会释放可变大小的块。
【讨论】:
【参考方案2】:这段代码安全吗?
是的。
如果是,c++怎么知道要分配多少内存...
vector 有责任专门了解和管理自己的存储,因此您不必这样做。
这是封装的全部要点。 你要做的就是确保向量本身被正确地创建和销毁(在代码中这一切都很好,如图所示)。
【讨论】:
以上是关于您可以在 C++ 中动态分配带有向量作为字段的类吗?的主要内容,如果未能解决你的问题,请参考以下文章