我的类有一个具有以下原型的方法:
std::string
Block::get_field(std::string rec_type, std::string field) { ... }
它从映射中检索一个值,将其转换为字符串,然后返回该字符串。
有人使用我的类如下:
char * buf = block.get_field(my_rec, my_field).c_str();
除非我弄错了,否则这是将 buf 设置为指向临时字符串。不久之后,当他查看 *buf 时,它已损坏。
显然,我希望我的用户写:
std::string buf = block.get_field(my_rec, my_field);
作为 Block 的作者,我如何防止这样的滥用行为?或者有没有办法我可以以某种方式支持这种用法?
更新1:直到我更改了映射的实现,从直接保存值到保存“内存引用”——长度和指向缓冲区的指针,这个错误才被发现。但是get_field
总是返回一个字符串——不是 astring*
或string&
a——所以我假设它总是返回一个临时的。我不明白为什么它之前没有中断(我也很尴尬;我声称我的更改不会影响 API)。
我准备通知用户他必须修改他的代码,但我希望能够引用他违反的“规则”,并可能解释他之前是如何“走运”的。
更新 2:似乎有可能(参考更新 1),刚才出现错误的原因是我的“幕后”更改要求我将以下开关添加到 g++ 4.4.7:-std=gnu+ +0x,这可能影响了临时对象的回收方式。