在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? } MyVectorOfObjects.clear(); for(unsigned_uuint8 i=0;i,它的内存由程序自动管理-将其视为删除parserObject就在for-循环之后,尽管这在实践中并不一定发生。@R.Martinho感谢您的参考。。。这意味着只要MyVectorOfObject在作用域中,每个复制的parserObject都会在作用域中?如果你使用的是C++0x,那么一定要定义move构造函数和move-operators。这两个答案都很好,我希望我能接受这两个;然而,由于被迫做出选择,这一次明确回答了问题。谢谢大家的帮助。
我的问题是:在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? } MyVectorOfObjects.clear(); for(unsigned_uuint8 i=0;i,它的内存由程序自动管理-将其视为删除parserObject就在for-循环之后,尽管这在实践中并不一定发生。@R.Martinho感谢您的参考。。。这意味着只要MyVectorOfObject在作用域中,每个复制的parserObject都会在作用域中?如果你使用的是C++0x,那么一定要定义move构造函数和move-operators。这两个答案都很好,我希望我能接受这两个;然而,由于被迫做出选择,这一次明确回答了问题。谢谢大家的帮助。,c++,vector,C++,Vector,我的问题是: 根据,由于没有使用new关键字,parserObject是否会超出每次迭代的范围?显然,这个代码一直在工作 在这种情况下,将对象放置在向量中是否会使parserObject保持在范围内 根据,将复制parserObject。如果是这种情况,这对性能有什么影响(例如内存消耗、内存分配等)?此外,复制的parserObjects是否假定与向量的作用域相同 谢谢你的帮助 MyVectorOfObjects.push_back(parserObject); // Does this ke
new
关键字,parserObject
是否会超出每次迭代的范围?显然,这个代码一直在工作向量中是否会使parserObject
保持在范围内
MyVectorOfObjects.push_back(parserObject); // Does this keep parserObject in scope?
push_back
制作对象的副本并存储它
因此,如果类MyParserObject
具有指针成员,请确保已为该类正确定义了复制构造函数(和复制赋值)。或者编译器生成的默认代码就足够了,前提是MyParserObject
的每个成员都遵循相同的模式(即,如果他们有指针成员,他们已经正确地定义了复制构造函数(和复制赋值),或者编译器生成的默认代码就足够了,前提是……。)
for
循环中声明的parserObject
实例都超出范围parserObject
放入vector
不会将该对象保留在范围内。push_-back()
方法将创建现在属于向量的对象的副本。您需要确保可以正确复制对象(可能需要复制构造函数和赋值运算符)。在本例中,向量中包含的副本归向量所有,其对象生存期与向量本身类似
paserObject
,这可能会影响内存使用和性能。如果parserObject
复制起来并不简单,那么这可能是一个昂贵的操作。这完全取决于您对parserObject
的实现这有点基本的C++。我建议你抓住一个机会,从中学习。也就是说,你需要认识到C++和C++之间的一个很大的区别:在C++中,变量包含值(除非明确地声明为引用),而在C语言中,大多数变量包含引用(当然,不计算值类型)。代码>,它的内存由程序自动管理-将其视为
删除parserObject代码>就在for
-循环之后,尽管这在实践中并不一定发生。@R.Martinho感谢您的参考。。。这意味着只要MyVectorOfObject在作用域中,每个复制的parserObject都会在作用域中?如果你使用的是C++0x,那么一定要定义move构造函数和move-operators。这两个答案都很好,我希望我能接受这两个;然而,由于被迫做出选择,这一次明确回答了问题。谢谢大家的帮助。