0

我确定我做错了什么,但对于我的生活,我无法弄清楚是什么!请考虑以下代码:

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(). 这段代码已被写入 set 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;

正如预期的那样,我得到了三次“测试”。

所以现在我不知道发生了什么。似乎很明显,我的程序中发生了一些奇怪的事情,而样本中没有发生,但我不知道它是什么,而且我对如何继续寻找没有想法。有人可以启发我,或者至少指出我正确的方向吗?

4

1 回答 1

5

我假设这el.getText()是返回一个临时string对象。当该对象被销毁时,返回的指针c_str()不再有效(请记住,这也是使返回的指针c_str()失效的其他方式)。

临时对象将在创建它的完整表达式的末尾被销毁(在上面的示例中通常位于分号处)。

您可以通过以下方式解决您的问题:

const char *value = strdup(el.getText().c_str());

它将字符串的副本创建为char动态分配的内存中的原始数组。然后,您将负责free()在不再需要该数据时调用该指针。

于 2013-01-26T03:31:54.833 回答