向量push_back调用对象析构函数

克里斯555888

在这里,类似的问题已经被问过很多次了,但是答案并不能解决我的问题。

假设我有:

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绝对是个好主意吗?

皮特·贝克尔

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

如果不希望销毁旧对象,请执行与或多或少std::deque相同的操作std::vector,但会增加一些开销,而不必重新分配存储。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么调用从对象移出的析构函数?

按值传递对象时调用的析构函数

C ++:析构函数在对象范围之外被调用?

使用Vector创建对象时如何调用析构函数

对象向量的析构函数

智能指针析构函数调用的向量

C ++没有匹配函数来调用向量push_back

如何阻止析构函数在堆栈分配的对象上被调用?

向量中的匿名构造函数和析构函数调用

在使用仅移动类型派生的类中定义析构函数时,使用std :: vector的emplace_back或push_back创建时会产生编译时错误

向量擦除调用的错误析构函数

析构函数在C ++中调用向量

从析构函数调用线程的向量

为什么要在std :: vector :: push_back(T object)方法中构造对象时调用析构函数?

没有匹配的成员函数调用“ push_back”,共享指针的向量

C ++:删除对象而不调用析构函数

使用move构造函数的push_back是否不调用析构函数?

调用类型嵌套在类内部的对象析构函数?

向量内存分配调用以使用push_back函数复制构造函数

返回的结构调用它自己的析构函数,该析构函数销毁分配的对象

GDB:调用特定对象的析构函数时的断点

为什么使用虚拟析构函数进行std :: vector :: push_back segfaults?

循环内创建的对象调用哪个C ++向量push_back

析构函数调用

在函数调用期间析构对象

析构函数和向量

析构函数使用静态对象调用两次

push_back 在调用析构函数时使对象中的指针无效

std::map 对象析构函数被调用?