管理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
不会在每次迭代时超出范围? 显然这个代码一直在工作。
在这种情况下,将对象放在vector
将parserObject
保持在范围内?
根据这个问题,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
每个成员遵循相同的模式(即,如果它们具有指针成员,则它们已正确定义了复制构造函数(和复制赋值),否则默认代码由编译器生成就足够了,提供....等等。)
上一篇: Managing Scope and Object Lifetime Within STL Vectors
下一篇: Why is the copy constructor being called before deleting the object?