我创建了一个类,它在构造函数中分配自己的内存,并在析构函数中释放它。
但是,如果我像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。
答案 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的所有实例。