为什么std :: vector的构造函数调用自定义类的析构函数?

边境

我创建了一个类,该类在构造函数中分配其自己的内存,并在析构函数中对其进行分配。但是,如果我将std::vector<CLASS> m(1)其分配的数据作为std :: vector立即释放。这意味着我将丢失在构造函数中分配的所有数据。我该如何预防呢?例子:

#include <iostream>
#include <vector>
class test
{
public:
    test()
    {
        std::cout<<"construction of test"<<std::endl;
        std::cout<<"  -MEMORY ALLOCATION"<<std::endl;
    }
    ~test()
    {
        std::cout<<"destruction of test"<<std::endl;
        std::cout<<"  -MEMORY DEALLOCATION"<<std::endl;
    }
};
int main()
{
    std::vector<test> m(1);
    std::cout<<"main"<<std::endl;
    return 0;
}

该代码为我输出了此代码:

construction of test
  -MEMORY ALLOCATION
destruction of test
  -MEMORY DEALLOCATION
main
destruction of test
  -MEMORY DEALLOCATION

我在Windows 7上使用带有-Os和-std = c ++ 11的g ++(如果很重要)。

AB

发生的情况是test创建了一个临时对象,将其复制到向量中,然后销毁。其副本将保留在向量中,直到向量被销毁为止。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么不能在析构函数可以的同时显式调用构造函数?

为什么析构函数比构造函数调用得更多?

为什么要调用派生类的析构函数?

当析构函数调用构造函数时会发生什么?

为什么插入用户定义的析构函数需要用户定义的副本构造函数

为什么类的默认构造函数和析构函数是内联的?

为什么要调用析构函数

为对象分配值时为什么调用构造函数和析构函数

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

为什么std :: vector在离开其他作用域的同时调用析构函数?

为什么std :: shared_ptr两次调用我的析构函数?

为什么不调用继承类的析构函数?

当对象绑定到成员函数时,为什么std :: function会调用析构函数?

为什么析构函数被调用两次而构造函数仅被调用一次?

std :: unique_ptr的自定义删除程序是否是手动调用析构函数的有效位置?

为什么在构造时调用C ++类的析构函数?

为什么从`std :: async`阻塞返回的是将来的析构函数?

为什么我的类析构函数立即被调用?

为什么在g ++产生的汇编代码中这样定义构造函数/析构函数?

在派生类构造函数中引发异常。为什么调用基类析构函数而不是派生类析构函数?

为什么构造函数调用取决于默认析构函数的存在?

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

为什么类的构造函数被调用了四次,而在程序即将结束的时候,析构函数只被调用了两次?

为什么在抛出我的析构函数时没有调用 std::terminate

为什么同一个类对象的构造函数和析构函数被隐式调用多次

为什么在父类之前调用子类的析构函数?

为什么不调用析构函数?

为什么在具有用户定义的析构函数的类中获得隐式移动构造函数

如果 std::vector 使用移动构造函数将对象重新分配到新内存,那么为什么必须在原始对象上调用析构函数?