管理STL矢量中的作用域和对象生存期
Managing Scope and Object Lifetime Within STL Vectors
我来自C#世界,我正在努力确保我不会在分配给我的C++项目中引入内存泄漏和错误。我正在编写使用structs从数据缓冲区解析信息的代码。由于缓冲区中出现的数据结构的数量在运行时可能会有所不同,因此使用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
具有指针成员,请确保为其正确定义了复制构造函数(和复制赋值(。否则,编译器生成的默认代码就足够了,前提是MyParserObject
的每个成员都遵循相同的模式(即,如果它们有指针成员,则它们已经正确定义了复制构造函数(和复制赋值((,否则,编译器生成的默认代码也就足够了。。。。等等。(
- 在构造函数中输入对象时C++类成员作用域
- 混合指向已分配对象和作用域对象的指针
- 在一个作用域中推送五个对象指针,然后检查对象的布尔值是否为 false,会给出错误
- 类的堆分配对象是否在其作用域之后但在 C++ 中调用其析构函数之前处于活动状态
- 在c++中,全局作用域中只允许"表达式"初始化全局对象.我在哪里可以在标准中找到这个
- 无法访问类作用域中的对象
- 在提升作用域出口中调用对象函数
- 用LD_PRELOAD和C++中的全局作用域对象加载堆分析器
- 将对象的属性传递到方法时出现作用域问题.(opencv相关)
- 在调用函数的作用域中构造返回的对象
- 本地对象的作用域
- 函数作用域的静态非 Pod 对象初始化
- C++有必要删除主作用域末尾动态分配的对象
- 超出作用域在c++对象中意味着什么
- Lambda Capture by Value强制所有作用域对象为常量
- 当类没有析构函数时,智能指针或作用域指针会删除对象吗
- 未在作用域中声明指针对象
- 当shared_ptr的实例仍在作用域中时,共享指针的对象被删除
- 对临时对象的常量引用在函数作用域(生存期)后被破坏
- 堆上的对象何时超出作用域?