管理STL向量中的范围和对象生命周期

来自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?
}

我的问题具体是:

  • 根据这个问题,由于不使用new关键字, parserObject不会在每次迭代时超出范围? 显然这个代码一直在工作。

  • 在这种情况下,将对象放在vectorparserObject保持在范围内?

  • 根据这个问题,parserObject被复制。 如果是这种情况,那么这对性能的影响(如内存消耗,内存分配等)是什么? 另外,复制的parserObjects然后假设与向量相同的范围?

  • 谢谢你的帮助。


  • 是的,每次循环迭代时,在for循环中声明的parserObject实例就会超出范围。

  • 不,将parserObject放入vector不会将该对象保留在范围内。 push_back()方法将复制该vector现在拥有的那个对象。 您需要确保您的对象可以正确复制(可能需要复制构造函数和赋值运算符)。 本例中载体中包含的拷贝由矢量所有,并且具有与vector本身相似的对象生命周期。

  • paserObject被复制,这可能会影响内存使用情况和性能。 如果parserObject不是无关紧要的,那么这可能是一个昂贵的操作。 这完全取决于你的parserObject的实现。


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

    push_back复制对象并存储它。

    所以如果它有指针成员,确保你已经为MyParserObject类正确地定义了copy-constructor(和copy-assignment)。 否则编译器生成的默认代码就足够了,只要MyParserObject每个成员遵循相同的模式(即,如果它们具有指针成员,则它们已正确定义了复制构造函数(和复制赋值),否则默认代码由编译器生成就足够了,提供....等等。)

    链接地址: http://www.djcxy.com/p/96543.html

    上一篇: Managing Scope and Object Lifetime Within STL Vectors

    下一篇: Why is the copy constructor being called before deleting the object?