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

时间:2013-12-07 14:30:28

标签: memory-management 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上使用g ++和-Os和-std = c ++ 11。

2 个答案:

答案 0 :(得分:1)

会发生什么,创建一个临时的test对象,复制到向量中,然后销毁。它的副本存在于载体中,直到载体被破坏。

答案 1 :(得分:0)

如同Mooing Duck发布的代码一样,您会看到由于A.B所描述的原因而发生的副本。

我猜你真正想要实现的是什么,但如果你只想用一个“测试”实例初始化矢量,没有副本发生,那么你可以在C +中使用emplace机制+11个容器。

int main()
{
    std::vector<test> m();
    m.emplace_back();
    std::cout<<"main"<<std::endl;
    return 0;
}

这应该输出(假设在复制构造函数中打印,甚至):

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

emplace_back()在向量中就地构造对象,而不进行任何复制。如果你的“test”构造函数有参数,那么这些参数将成为emplace_back的参数,并且将被转发到构造函数,同样没有副本。

注意:如果emplace_back导致重新分配,仍然可以发生复制(或移动),因此为了获得最佳性能,请确保向量的容量足以包含您emplace_back的所有实例。