您可以在 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&lt;int&gt; x) 也会有问题 一般情况下,所有相同类型对象的二进制表示具有相同的大小(可通过sizeof 运算符实现)。 std::vector&lt;int&gt; 对象的二进制表示不包含任何向量元素*。它通常只包含一个指向堆上动态分配存储的指针,其中存储了元素。 (*) 这在理论上可以通过 小缓冲区优化 技术实现,但 std::vector 不允许这样做。还有其他实现它的向量实现(例如boost::container::small_vector)。 【参考方案1】:

vector&lt;foo&gt; 由两部分组成:一个由指针和元素计数组成的固定大小的块,以及指针指向的可变大小的块。当你创建一个新的vector&lt;foo&gt;时,它不包含foos;元素的计数为零,并且指针(取决于实现)可能为空。当您销毁向量时(当您删除 vu 时会发生这种情况),它会释放可变大小的块。

【讨论】:

【参考方案2】:

这段代码安全吗?

是的。

如果是,c++怎么知道要分配多少内存...

vector 有责任专门了解和管理自己的存储,因此您不必这样做。

这是封装的全部要点。 要做的就是确保向量本身被正确地创建和销毁(在代码中这一切都很好,如图所示)。

【讨论】:

以上是关于您可以在 C++ 中动态分配带有向量作为字段的类吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中创建一个作为另一个类的向量的类?

将“push_back”用于带有“get”函数C++的向量

C++ priority_queue 底层向量容器容量调整大小

你能在 C++ 中保护嵌套类吗?

你能帮我处理我的 const_iterator 内部类吗?

将值从向量分配给动态数组(C++)