我确信我做错了什么,但对于我的生活,我无法弄清楚是什么!请考虑以下代码:
cerr<<el.getText()<<endl;
cerr<<el.getText().c_str()<<endl;
cerr<<"---"<<endl;
const char *value = el.getText().c_str();
cerr<<"\""<<value<<"\""<<endl;
field.cdata = el.getText().c_str();
cerr<<"\""<<field.cdata<<"\""<<endl;
el
是一个XML元素,getText
返回一个std :: string。正如所料,el.getText()
和el.getText().c_str()
打印相同的值。但是,value
设置为""
- 即空字符串 - 当它分配c_str()
的结果时。此代码已写入设置field.cdata=value
,因此正在清除它。将其更改为所谓的相同表达式value
设置后,它可以正常工作,最后一行打印出预期值。
由于el
在堆栈上,我认为我可能已经破坏了它 - 但即使设置value
后,el
中的基础值仍然正确。
我的下一个想法是,有一些奇怪的编译器特定问题,将事物分配给const指针,所以我写了以下内容:
std::string thing = "test";
std::cout << thing << std::endl;
std::cout << thing.c_str() << std::endl;
const char* value = thing.c_str();
std::cout << value << std::endl;
正如预期的那样,我进行了三次“测试”。
所以现在我不知道发生了什么。很明显,我的程序中有一些奇怪的事情在样本中没有发生,但我不知道它是什么,我不知道如何继续寻找。有人可以启发我,或者至少指出我正确的方向吗?
答案 0 :(得分:5)
我假设el.getText()
正在返回一个临时的string
对象。当该对象被销毁时,c_str()
返回的指针不再有效(请记住,c_str()
返回的指针的其他方式也可能无效)。
临时对象将在其创建的完整表达式的末尾被销毁(在上例中通常为分号)。
您可以使用以下内容解决问题:
const char *value = strdup(el.getText().c_str());
在动态分配的内存中创建字符串的副本作为原始char
数组。然后,当不再需要该数据时,您将负责在该指针上调用free()
。