多个新对象具有相同的指针地址

时间:2014-10-24 16:43:18

标签: c++

我对C ++比较陌生,所以如果这是一个愚蠢的问题,我马上道歉但是我不能为我的生活找出最新情况。本质上,我输入一个创建对象的辅助函数,然后返回指向每个对象的指针。它的工作正常,但弹出的问题是,有时,指针值与函数调用的最后一次迭代相同。

例如:

我经常会看到一些东西......

0x7fff5d1d0f10
0x7fff5d1d0d80
0x7fff5d1d0d80 <- same as the last pointer
0x7fff5d1d0fe0
0x7fff5d1d0fe0 <- same as the last pointer

这是未定义的行为吗?我非常,非常感谢任何和所有的帮助!

指针是这个辅助函数的返回值(抱歉它有点冗长):

w5::iMessage* w5::getMessage(std::ifstream& file, char limiter){

    std::string result;

    int line_no = 0;

    std::string line;
    while (getline(file, line)){
        if(line[0] == 'T' or line[0] == 'e'){
            iMessage * message;
            message = nullptr;
            std::string user = "";
            std::string reply = "";
            std::string tweet = "";

            if (line[0] == 'T'){
                int length = line.length();
                int _user = line.find("T");
                int _reply = line.find("@");
                if(_reply != std::string::npos){
                    int first_space = line.find_first_of(" ");
                    int second_space = line.find_first_of(" ", _reply);
                    //user
                    //std::cout << line.substr(_user+1, _reply-2) << std::endl;
                    user = line.substr(_user+1, _reply-2);
                    //reply
                    // std::cout << line.substr(_reply+1, second_space-_reply)  << std::endl;
                    reply = line.substr(_reply+1, second_space-_reply);
                    //tweet
                    //std::cout << line.substr(second_space+1)  << std::endl;
                    tweet = line.substr(second_space+1);
                    Twitter twitter(user, tweet, reply);
                    // std::cout << &twitter << std::endl;
                    message = &twitter;
                    // std::cout << message << std::endl;
                    return message;

                }else{
                    int _tweet = line.find(" ");

                    //user
                    //std::cout << line.substr(_user+1, _tweet) << std::endl;
                    std::string user = line.substr(_user+1, _tweet);

                    //tweet
                    if(_tweet != std::string::npos){
                        // std::cout << line.substr(_tweet+1)  << std::endl;
                        std::string tweet = line.substr(_tweet+1);
                        if(tweet != ""){
                            Twitter twitter(user, tweet, "");
                            iMessage * message;
                            // std::cout << &twitter << std::endl;
                            message = &twitter;
                            // std::cout << message << std::endl;
                            return message;
                        }
                    }
                }


            }

            if(line[0] == 'e'){
                int length = line.length();
                int _from = line.find("From:");
                int _to = line.find(" To:");
                int _date = line.find(" Date:");
                int _body = line.find(" Body:");
                std::string to = "";
                std::string from = "";
                std::string date = "";
                std::string body = "";
                //from
                //std::cout << line.substr(_from+5, _to-_from-4) << std::endl;
                to = line.substr(_from+5, _to-_from-4);
                //to
                // std::cout << line.substr(_to+4, _date-_to-3) << std::endl;
                from = line.substr(_to+4, _date-_to-3);
                //date
                // std::cout << line.substr(_date+6, _body-_date-6) << std::endl;
                date = line.substr(_date+6, _body-_date-6);
                //body
                // std::cout << line.substr(_body+6) << std::endl;
                body = line.substr(_body+6);
                Email email(from, to, body, date);
                // std::cout << &email << std::endl;
                message = &email;
                // std::cout << message << std::endl;
                return message;
            }

            result += line + "\n";
            line_no++;
        }
    }

    iMessage *message;
    message = nullptr;
    return message;

}

这些问题存在问题:

        Email email(from, to, body, date);
        // std::cout << &email << std::endl;
        message = &email;
        // std::cout << message << std::endl;
        return message;

由于某种原因,&amp; email的指针值似乎与上一次迭代相同,而不是新的指针值。函数的其他返回点也存在同样的问题。

&#39; iMessage message&#39;是一个抽象的基类。

1 个答案:

答案 0 :(得分:3)

您正在堆栈中创建对象并返回它们。这是一件糟糕的事情,因为堆栈上的对象将a)在创建它的范围被删除时被销毁,b)你返回的内存不会返回。< / p>

您需要分配对象以在堆上返回并通过指针返回它们,然后在完成它们时将它们清理干净。您可能希望考虑返回某种智能指针来管理您正在分配的动态内存的生命周期。

所以,而不是

    Email email(from, to, body, date);
    // std::cout << &email << std::endl;
    message = &email;
    // std::cout << message << std::endl;
    return message;

你想这样做:

    message = new Email(from, to, body, date);

    return message;

当前实现有时显示相同内存地址的原因仅仅是因为对象恰好在堆栈上的相同位置创建。问题在于您返回指向这些基于堆栈的对象的指针,而不是在堆上分配并返回一个可以比函数调用更长的对象。