c++ - 被复制到 vector 中的对象被清除,因为原始预复制已被清除()

标签 c++ memory-management vector

我有类似的东西:

#include<vector>

using namespace std;

vector<char> temp;
vector<char> allbytes = GetBytes();
vector<MyClass> outsidecontainer;

for(int i=0; i<allbytes.size(); i++){

    //Populate my buffer
    if(something){
        temp.push_back(allbytes[i]);
    }

    //temporary buffer now needs to be used to create MyClass object 
    //and outside container store this MyClass object
    else{
        MyClass m(temp);
        outsidecontainer.push_back(m);

        //Empty the temporary buffer ready for next population
        temp.clear();
    }
}

class MyClass{
    public:
    MyClass(vector<char> Message);

    private:
    vector<char> Message;
};

问题是到了最后,outsidecontainer 持有空的 MyClass 对象。换句话说,由于 clear(),temp 已被清空。但是,我不认为这会影响 outsidecontainer 中的值,因为 temp 被复制到 MyClass m,它也被复制到 outsidecontainer。它们不存储对象的引用或指针??

我如何实现上述设计,能够使用 temp 创建 MyClass 对象并为下一次填充清除它?

编辑:

即使 MyClass m 具有循环作用域,添加到 outsidercontainer 的对象是否会在循环结束后保留​​,因为值已复制到数组中?

编辑2:

#include "FIXMessage.h"


FIXMessage::FIXMessage(vector<char> message){
    Message = message;
}

FIXMessage::FIXMessage(const FIXMessage& rhs){

}

最佳答案

您的第二次编辑显示了这一点

FIXMessage::FIXMessage(const FIXMessage& rhs){
}

通过这样做,您明确地强制 FIXMessage 复制构造函数复制任何内容。这就是为什么你用这个复制构造函数复制的所有对象最终都是空的。是的,在向 vector 添加元素时使用复制构造函数。

如果您想编写自己的复制构造函数,您有责任仔细复制类的所有子对象:基子对象和成员子对象。你必须手动完成。相反,您完全禁止了所有复制。为什么?

难怪复制的对象最终为空。

但这里真正的问题是您是否真的需要一个手动实现的复制构造函数。也许提供的编译器可以正常工作?没有看到您的 FIXMessage 类包含的内容,就没有办法说出来。

例如,如果您的 FIXMessage 包含一个 std::vector 而没有其他任何东西,您根本不必编写复制构造函数。编译器将为您提供一个,它将正确复制所有内容。

最后,学习使用引用和初始化列表

FIXMessage::FIXMessage(const vector<char> &message) : Message(message) 
  {}

按值传递重对象,例如 std::vector 没有多大意义,除非您有充分的理由这样做。

附言所以你发布的原始代码是假的。不要发布虚假代码。它只能浪费人们的时间。

关于c++ - 被复制到 vector 中的对象被清除,因为原始预复制已被清除(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18927712/

相关文章:

c++ - 读/写文件,字节丢失,可能是字符溢出

c++ - 多重继承析构函数调用他自己和父析构函数? C++

ios - 强制释放以 strong 声明的属性

c# - C# 中的性能和内存消耗

c++ - std::vector 中的每个元素访问都是缓存未命中吗?

C++ 读入一行字符串作为整数?

c++ - 动态加载QTGui

C++ 哈希表 - 如何解决 unordered_map 与自定义数据类型作为键的冲突?

c++ - KD-Tree 构建例程中的严重错误

perl - 使用Scalar::Util 的弱化会导致无效引用问题吗?