为什么这会产生意外的输出?
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:
我的输出非常随机。
答案 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);
这样,你的指针就会指向一个新的内存块。