std :: map用std :: string *作为键

时间:2014-03-09 00:41:44

标签: c++ map segmentation-fault stdstring

我正在使用带有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字段指向NULL0x2,但在插入地图时密钥始终完好无损:

bars[new string(on_stack_string)] = bar;

在gdb中,看起来new string(on_stack_string)_M_p字段指向正常的堆位置,而不是堆栈值。 std::string有什么特别之处,它不能用在像这样的数据结构中吗?也许我用钥匙做了别的蠢事,但我想不出它会是什么。

1 个答案:

答案 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