首页 > 解决方案 > 返回类型 char* 的成员函数在 while 循环后返回包含不同字符串的地址

问题描述

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

STRING并且VAR有自己的get_value()成员函数,并且它们不是彼此固有的。我什至在VAR'sset_value()函数中动态分配内存,所以我很确定STRING()没有改变任何东西。请原谅我发的太多了。

输出

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

主文件

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;

VAR.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] = '\0';
};

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] = '\0';
};

new.vnm(文本文件)

foo = "Hello";

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

标签: c++

解决方案


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


推荐阅读