来自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?
}
我的问题具体是:
根据this question,由于未使用parserObject
关键字,每次迭代都不会new
超出范围?显然这段代码一直在运作。
在这种情况下,是否将对象放在vector
中保留parserObject
范围内?
根据this question,将复制parserObject。如果是这种情况,那么性能影响(例如内存消耗,内存分配等)是什么?此外,复制的parserObjects是否假设与向量相同的范围?
感谢您的帮助。
答案 0 :(得分:7)
是的,每次循环迭代时,parserObject
循环内声明的for
实例都超出了范围。
不,将parserObject
放入vector
并不会将该对象保留在范围内。 push_back()
方法将复制现在由vector
拥有的对象。您需要确保可以正确复制对象(可能需要复制构造函数和赋值运算符)。此示例中向量中包含的副本由向量拥有,并且对象生命周期与vector
本身类似。
复制paserObject
,这可能会影响内存使用情况和性能。如果复制parserObject
并不容易,那么这可能是一项昂贵的操作。这完全取决于您对parserObject
。
答案 1 :(得分:4)
MyVectorOfObjects.push_back(parserObject); // Does this keep parserObject in scope?
push_back
制作对象的副本并存储它。
因此,如果它具有指针成员,请确保已为类MyParserObject
正确定义了复制构造函数(和复制赋值)。否则编译器生成的默认代码就足够了,前提是MyParserObject
的每个成员都遵循相同的模式(即如果他们是指针成员,他们已经正确定义了复制构造函数(和复制赋值),或者否则编译器生成的默认代码就足够了,提供....等等。)