返回类型 char* 的成员函数返回在 while 循环后包含不同字符串的地址

Member function of return type char* returns address that contains different string after while loop

本文关键字:循环 包含不 字符串 while 地址 char 成员 函数 返回 返回类型      更新时间:2023-10-16

我的代码逐字读取文本文件中的输入,并为每个标记实例化一个对象。在 while 循环中,当我在 VAR 对象上调用 get_value() 并取消引用它时,我得到了我想要的字符串"foo",但在循环之外,我得到了属于STRING对象的字符串 "HELLO" .我很确定调用构造函数STRING是导致问题的原因,但我无法确定问题所在。

STRINGVAR都有自己的get_value()成员功能,它们不是彼此固有的。我什至在VARset_value()函数中动态分配内存,所以我很确定STRING()没有改变任何东西。如果我发得太多,请原谅我。

输出

$ ./venom
0x7ffeeb3a02d8
foo
0x7ffeeb3a02f8
0x7ffeeb3a02d8
Hello
Hello

主.cpp

ifstream in("new.vnm");
string s;
STRING *ptr1;
VAR    *ptr2;
    while(in >> s){
        if(s[0] == '"') {
                        //Address to (H)ello
            STRING str(&s[1]);
            ptr1 = &str;
            //0x7ffeeb3a02f8 -- That's OK
            cout << ptr1 << endl;
        }
        else if((s[0] > 'a' && s[0] < 'z') || (s[0] >'A' && s[0] < 'Z')) {
                    //Address to (f)oo
            VAR var(&s[0]);
            ptr2 = &var;
            // 0x7ffeeb3a02d8 -- This is OK.
            cout << ptr2 << endl;
            // Value stored at ptr2 -- Prints foo -- That's OK.
            for(int i = 0; ptr2->get_value()[i]; i ++)
                cout << ptr2->get_value()[i];
            cout << endl;
        }
    };
    // 0x7ffeeb3a02d8 -- That's OK
    cout << ptr2 << endl;

    // Printing Value stored at ptr2 -- Hello -- This is NOT OK!
    for(int i = 0; ptr2->get_value()[i]; i ++)
        cout << ptr2->get_value()[i];
    cout << endl;
    // Printing Value stored at ptr1 -- That's OK.
    for(int i = 0; ptr1->get_value()[i]; i ++)
        cout << ptr1->get_value()[i];
    cout << endl;

瓦尔.cpp

void VAR::set_name(char *name) {
    this->name = new char[this->len+1];
    for(int i = 0; i < len; i ++)
        this->name[i] = name[i];
    this->name[this->len+1] = '';
};
char *VAR::get_value() const {
    return this->name;
};

字符串

.cpp
char *STRING::get_value() const {
    return this->value;
};
void STRING::set_value(char *str) {
    this->value = new char[this->len + 1];
    for(int i = 0; i < this->len; i ++) 
        this->value[i] = str[i];
    this->value[this->len + 1] = '';
};

new.vnm (文本文件(

foo = "Hello";

ptr2->get_value()应该指向foo而不是Hello

在循环之外,ptr2ptr1都指向不再存在的对象 - 它们已经被销毁,因为它们的范围更小。这是未定义的行为,是一个严重的错误。在这种情况下,任何事情都可能发生,幸运的是,您的程序只打印而不是您期望的内容,而不仅仅是崩溃。

你正在获取指向本地范围的对象的指针,然后在对象超出范围后取消引用该指针。这是未定义的行为。

本质上你的代码是这样的

VAR *ptr2;
{
    VAR var;
    ptr2 = &var;
}
ptr2->get_value() // this is invalid because 'var' no longer exists.