将字符串复制到类中的const char

时间:2018-01-10 00:29:45

标签: c++

为什么这会产生意外的输出?

class MyClass
{
    public:
        MyClass(string item)
        {
            _item = item.c_str();
            std::cout << "Constructor: " << _item << endl;
        }

        void printItem()
        {
           std::cout << "Print:" << _item << endl;
        }

    private:
        const char* _item;
};

int main(int argc, char* argv[])
{
    MyClass my("www.somewebsite.com");
    my.printItem();
    return 0;
}

当我传递一个简短的文字,例如&#34; abc&#34;进入构造函数,我得到了预期的输出:

Constructor: abc
Print: abc

但是,如果我输入更长的内容,例如网址&#34; www.somewebsite.com,我会得到:

Constructor: www.somewebsite.com
Print: 

我的输出非常随机。

2 个答案:

答案 0 :(得分:4)

您的构造函数按值string 获取。然后,您将string的基础数据指针指定给_item成员。

构造函数返回后,item参数超出范围并被销毁,使_item指针悬空,指向现在无效的内存。

您应该将const char* _item;更改为std::string _item;。然后,您只需在构造函数中复制字符串。

MyClass(string item)
{
    _item = item;
    std::cout << "Constructor: " << _item << endl;
}

甚至用初始化列表

初始化它
MyClass(string item) : _item(item)
{
    std::cout << "Constructor: " << _item << endl;
}

答案 1 :(得分:0)

就像已经指出的那样,构造函数按值获取字符串,然后为其分配指针。因此,当构造函数返回时,字符串将被销毁,指针变得毫无意义。

你需要做什么来复制字符串的值,如下所示:

const char* cStr = item.c_str();
_item = (char*)malloc(strlen(cStr) * sizeof(char));
strcpy(_item, cStr);

这样,你的指针就会指向一个新的内存块。