Vector push_back 调用对象析构函数
Vector push_back calls object destructor
类似的问题已经在这里问过很多次了,但是下面的回答并没有解决我的问题。
假设我有:
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() 将只工作几次。一旦 vector 变得太小而无法容纳所有对象,它就会执行各种内部操作以保留更多内存以便能够扩展。问题是部分(如果不是全部)AClass 析构函数在此过程中被调用。
由于元素的数量未知,因此无法使用 reserve() 为向量保留更多 space。使用 emplace_back() 也没有解决我的问题。
那我该怎么做呢?有没有办法防止析构函数被调用?在这种情况下使用 std::vector 是个好主意吗?
当 std::vector
扩展其存储时,它会将当前对象复制或移动到新存储 space 中。旧对象被丢弃,这必然涉及对旧对象调用析构函数。
如果不需要销毁旧对象,std::deque
的操作与 std::vector
大致相同,但开销稍大,但无需重新分配存储空间。
如果内存使用不是问题,std::list
永远不会移动其存储的对象,但列表中的每个元素也有一对指针,一个指向列表中的前一个元素,一个指向列表中的前一个元素到下一个元素。
类似的问题已经在这里问过很多次了,但是下面的回答并没有解决我的问题。
假设我有:
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() 将只工作几次。一旦 vector 变得太小而无法容纳所有对象,它就会执行各种内部操作以保留更多内存以便能够扩展。问题是部分(如果不是全部)AClass 析构函数在此过程中被调用。
由于元素的数量未知,因此无法使用 reserve() 为向量保留更多 space。使用 emplace_back() 也没有解决我的问题。
那我该怎么做呢?有没有办法防止析构函数被调用?在这种情况下使用 std::vector 是个好主意吗?
当 std::vector
扩展其存储时,它会将当前对象复制或移动到新存储 space 中。旧对象被丢弃,这必然涉及对旧对象调用析构函数。
如果不需要销毁旧对象,std::deque
的操作与 std::vector
大致相同,但开销稍大,但无需重新分配存储空间。
如果内存使用不是问题,std::list
永远不会移动其存储的对象,但列表中的每个元素也有一对指针,一个指向列表中的前一个元素,一个指向列表中的前一个元素到下一个元素。