在这里,类似的问题已经问了很多遍了,尽管回答不能解决我的问题。
假设我有:
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真的是个好主意吗?
答案 0 :(得分:4)
std::vector
扩展存储空间时,会将当前对象复制或移动到新的存储空间。旧对象被丢弃,这必然涉及在旧对象上调用析构函数。
如果不希望破坏旧对象,则std::deque
的操作与std::vector
差不多,只是开销更大,而不必重新分配存储空间。
如果内存使用没有问题,则std::list
永远不会移动其存储的对象,但是列表中的每个元素也有一对指针,一个指针指向列表中的前一个元素,另一个指向指针。下一个元素。