向量push_back调用对象析构函数

时间:2019-02-10 15:36:03

标签: c++ vector destructor

在这里,类似的问题已经问了很多遍了,尽管回答不能解决我的问题。

假设我有:

1)两个类(ACLass和BClass)

2)AClass具有构造函数和析构函数

3)BClass具有一个std :: vector成员,用于存储AClass的对象

4)该向量中的元素数事先未知

5)每当调用BClass方法generateObject()时,向量都会随着创建新的AClass对象而扩展。这是通过调用std :: vector.push_back()完成的。

class AClass {
    AClass()  { //Constructor }
    ~AClass() { //Destructor }
};

Class BClass {
    std::vector<AClass> object;

    void generateObject() {
        object.push_back(AClass());
    }
};

现在,在上面的示例中,generateObject()将仅工作几次。一旦向量变得太小而无法容纳所有对象,它将执行各种内部操作,以便保留更多的内存以进行扩展。问题在于,在此过程中会调用某些(如果不是全部)AClass析构函数。

由于元素的数量是未知的,所以不能通过使用reserve()为矢量保留更多空间。使用emplace_back()也无法解决我的问题。

那么我该怎么做呢?有没有办法防止析构函数被调用?在这种情况下使用std :: vector真的是个好主意吗?

1 个答案:

答案 0 :(得分:4)

std::vector扩展存储空间时,会将当前对象复制或移动到新的存储空间。旧对象被丢弃,这必然涉及在旧对象上调用析构函数。

如果不希望破坏旧对象,则std::deque的操作与std::vector差不多,只是开销更大,而不必重新分配存储空间。

如果内存使用没有问题,则std::list永远不会移动其存储的对象,但是列表中的每个元素也有一对指针,一个指针指向列表中的前一个元素,另一个指向指针。下一个元素。