Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在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 - Fatal编程技术网

在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
    保持在范围内

  • 根据,将复制parserObject。如果是这种情况,这对性能有什么影响(例如内存消耗、内存分配等)?此外,复制的parserObjects是否假定与向量的作用域相同

  • 谢谢你的帮助

    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。这两个答案都很好,我希望我能接受这两个;然而,由于被迫做出选择,这一次明确回答了问题。谢谢大家的帮助。