字符串映射出现问题?

是的。我不知道自己做错了什么。

地图是:字符串、整数

以下是方法

bange::function::Add(lua_State *vm){
 //userdata, function
 if (!lua_isfunction(vm, 2)){
  cout << "bange: AddFunction: First argument isn't a function." << endl;
  return false;}
 void *pfunction = const_cast<void *>(lua_topointer(vm, 2));
 char key[32] = {0};
 snprintf(key, 32, "%p", pfunction);
 cout << "Key: " << key << endl;
 string strkey = key;
 if (this->functions.find(strkey) != this->functions.end()){
     luaL_unref(vm, LUA_REGISTRYINDEX, this->functions[strkey]);}
 this->functions[strkey] = luaL_ref(vm, LUA_REGISTRYINDEX);
 return true;

好的,当代码执行时,它崩溃并打印下面的输出:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff6e6caa9 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >
::compare(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const () from /usr/lib/libstdc++.so.6

说实话,我的代码有什么问题呢?感谢帮忙。

编辑1:

好吧,我已经解决了问题但仍然失败。我试着直接插入字符串,但它给出了相同的错误。

让我们看看,对象是从bange::function继承的bange::scene。我使用lua_newuserdata创建这个对象:

bange::scene *scene = static_cast<bange::scene *>(lua_newuserdata(vm, sizeof(bange::scene)));
(...)
scene = new (scene) bange::scene(width, height, nlayers, vm);

我需要这个Lua垃圾回收。现在从Lua访问bange::function::Add

static int bangefunction_Add(lua_State *vm){
    //userdata, function
    bange::function *function = reinterpret_cast<bange::function *>(lua_touserdata(vm, 1));
    cout &lt&lt "object with bange::function: " &lt&lt function << endl;
    bool added = function->bange::function::Add(vm);
    lua_pushboolean(vm, static_cast<int>(added));
    return 1;
}

Userdata bange::scene存储在Lua中。知道Userdata场景实际上是该对象之前创建场景时的方向。我需要reinterpret_cast,然后调用该方法。该指针"this"在方法中仍然是相同的方向。

解决的

我在bange::function构造函数中进行了一个小测试,没有出现问题。

bange::function::function(){
    string test("test");
    this->functions["test"] = 2;
}

我终于注意到问题是

bange::function *function = reinterpret_cast<bange::function *>(lua_touserdata(vm, 1));

因为该对象是bange::scene而不是bange::function(我承认,指针损坏) ,这似乎更像是代码设计问题。因此,某种意义上,这是解决的。谢谢大家。

原文链接 https://stackoverflow.com/questions/4538898

点赞
stackoverflow用户298661
stackoverflow用户298661

由于strkey是你唯一要比较的字符串,它必须是问题的根源,并且源于堆栈上的char []。我建议首先摆脱它。

std::stringstream str;
str << pfunction;
string strkey = str.str();

当然,如果你损坏了this或者简单地在任何时间和地点损坏了堆,也可能出现这种错误。

2010-12-27 13:22:13
stackoverflow用户3937
stackoverflow用户3937

可能这段代码没有任何问题。

当你的代码尝试读取或写入未映射到进程的内存时,就会发生段错误。发生的位置可能与 bug 的位置无关。

在程序执行到段错误之前的某个时刻,某段代码会破坏堆。这可能是:

  1. 访问已删除或已释放的指针
  2. 覆盖数组的边界
  3. 将对象强制转换为错误的类型并使用它

这些事情都不一定会立即崩溃——它们可能只是默默地破坏内存。稍后,在使用该内存时可能也不会崩溃(只是默默地破坏其他内存)。某个时刻你会崩溃,但这个时间可能与问题完全无关。

除错的策略是让第一次破坏引发崩溃。有几种方法可以做到这一点。

  1. 使用调试堆。这里是一些在 Linux 上使用 GCC 的可能性:Debug heap/STL debugging equivalent for GCC?

  2. Valgrind: http://valgrind.org/

2010-12-27 13:25:11