我正在使用带有std::map
密钥的const std::string
,我认为避免将密钥推到堆栈周围会很好,所以我将密钥类型更改为指针:
class less_on_star : less<const string*> {
public:
virtual bool operator() (const string* left, const string *right);
};
less_on_star::operator() (const string* left, const string *right) {
return *left < *right;
}
class Foo {
private:
map<const string*, Bar*, less_on_star> bars;
}
它运行良好一段时间,然后我开始得到段错误,其中字符串键失去了它的胆量。 _M_p
字段指向NULL
或0x2
,但在插入地图时密钥始终完好无损:
bars[new string(on_stack_string)] = bar;
在gdb中,看起来new string(on_stack_string)
将_M_p
字段指向正常的堆位置,而不是堆栈值。 std::string
有什么特别之处,它不能用在像这样的数据结构中吗?也许我用钥匙做了别的蠢事,但我想不出它会是什么。
答案 0 :(得分:0)
这需要一个轻量级,真的:
#include <boost/flyweight.hpp>
#include <map>
typedef boost::flyweight<std::string> string;
struct Bar
{
};
struct Foo {
std::map<string, Bar*> bars;
};
int main()
{
Foo foo;
foo.bars.insert(string("hello"), new Bar());
foo.bars.insert(string("world"), new Bar());
}
现在,为了对Bar*
元素有一定的安全性,为什么不使用boost::ptr_map
?