在STL向量中管理范围和对象寿命

时间:2011-08-24 18:38:35

标签: c++ vector

来自C#世界,我正在努力确保我不会在我被分配到的C ++项目中引入内存泄漏和错误。我正在编写使用结构来解析来自数据缓冲区的信息的代码。由于缓冲区中出现的数据结构数量可能会在运行时发生变化,因此stl向量用于存储已处理的数据。我在现有软件中遇到了以下代码块,并且很难理解它的工作原理:

MyVectorOfObjects.clear();
for (unsigned __int8 i = 0; i < NumberOfObjects; i++)
{
    MyParserObject parserObject;                // Declaring without 'new'?
    parserObject.Decode(buffer, offset, size);  // A method on the struct.
    MyVectorOfObjects.push_back(parserObject);  // Does this keep parserObject in scope?
}

我的问题具体是:

  1. 根据this question,由于未使用parserObject关键字,每次迭代都不会new超出范围?显然这段代码一直在运作。

  2. 在这种情况下,是否将对象放在vector中保留parserObject范围内?

  3. 根据this question,将复制parserObject。如果是这种情况,那么性能影响(例如内存消耗,内存分配等)是什么?此外,复制的parserObjects是否假设与向量相同的范围?

  4. 感谢您的帮助。

2 个答案:

答案 0 :(得分:7)

  1. 是的,每次循环迭代时,parserObject循环内声明的for实例都超出了范围。

  2. 不,将parserObject放入vector并不会将该对象保留在范围内。 push_back()方法将复制现在由vector拥有的对象。您需要确保可以正确复制对象(可能需要复制构造函数和赋值运算符)。此示例中向量中包含的副本由向量拥有,并且对象生命周期与vector本身类似。

  3. 复制paserObject,这可能会影响内存使用情况和性能。如果复制parserObject并不容易,那么这可能是一项昂贵的操作。这完全取决于您对parserObject

  4. 的实施情况

答案 1 :(得分:4)

MyVectorOfObjects.push_back(parserObject);  // Does this keep parserObject in scope?

push_back制作对象的副本并存储它。

因此,如果它具有指针成员,请确保已为类MyParserObject正确定义了复制构造函数(和复制赋值)。否则编译器生成的默认代码就足够了,前提是MyParserObject的每个成员都遵循相同的模式(即如果他们是指针成员,他们已经正确定义了复制构造函数(和复制赋值),或者否则编译器生成的默认代码就足够了,提供....等等。)