【发布时间】:2019-07-04 04:57:34
【问题描述】:
类似的问题已经在这里被问过很多次了,但是按照答案并没有解决我的问题。
假设我有:
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 是个好主意吗?
【问题讨论】:
-
std::list适合吗? -
“问题是在此过程中调用了一些(如果不是全部)
AClass析构函数。” 嗯,是的。为什么这是个问题?您还期望向量如何重新定位其元素? -
@IgorTandetnik 是的,这可能是向量的工作方式,但它仍然在我的实现中引起问题。主题是如何更改实现,或者要实现什么来解决这个问题。
-
@thb
std::list不是很慢吗?是否可以像使用数组和向量一样使用 operator[]访问std::list元素? -
嗯,具体来说,它在您的实施中造成了哪些问题?展示一个实际演示所述问题的示例。在向量重新分配上运行析构函数是正常的和预期的,通常不会被认为是有害的。如果它适合您,那么您的情况一定有什么不寻常之处 - 请解释它是什么。
标签: c++ vector destructor