函数超出范围后,C++ 对象数据被清除

C++ object data being wiped clean after function goes out of scope

CS 学生,第一个 post。

我正在处理两个对象。 obj1 通过引用传递给 obj2obj2 处理文件中的数据并将信息写入 obj1 中的 char[]。 obj1 然后计算 char 数组中的信息。

但是,一旦 obj2 中写入 char[] 的函数超出范围,所有已写入的信息都会被清除。我已经逐步完成代码,我很清楚 obj1 没有通过引用传递,但我不明白为什么。谁能帮我看看我错过了什么?

int main(int argc, char* argv[])
{
    //...
    Object1 obj1;   // obj1 created with &1
    Object2 obj2(filename, obj1);
    obj2.func1();   // void function that writes to obj1.arr -> writes fine but to a obj1.arr @ &2
    obj1.func1();   // obj1.arr @ &2 is gone, obj1.arr @ &1 is garbage.
}

// Object1.h
class Object1
{
    Object1() = default;
    char arr[size];
}

// Object2.h
class Object2 
{
    public: 
        Object1 obj1;
        string filename;
}

// Object2.cpp
Object2::Object2(string filename, Object1& obj1)
    : filename(filename), obj1(obj1)
{
}

我想你的问题可能出在这里:

// Object2.h
class Object2 
{
    public: 
       Object1 obj1;

请注意 Object2 有一个名为 obj1 的成员变量,并且您的 Object2 构造函数正在使用作为参数传入的引用来初始化该成员变量构造函数:

 Object2::Object2(string filename, Object1& obj1)
    : filename(filename), obj1(obj1)
 {

另请注意,obj1(obj1) 的含义在这里并不明显——您已将第二个构造函数参数命名为 obj1,但您还有名为 [=13] 的局部成员变量=].为了避免人类的歧义 reader,您应该更改参数的名称或成员变量的名称。

您可能还想将 Object2 class 的成员变量的类型从 Object1 更改为 Object1 &,如果您的意图是 Object2对象应该继续直接引用原始 obj1 对象,而不是使用它自己单独的 Object1 成员对象。