字符串映射出现问题?
是的。我不知道自己做错了什么。
地图是:字符串、整数
以下是方法
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 << "object with bange::function: " << 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
可能这段代码没有任何问题。
当你的代码尝试读取或写入未映射到进程的内存时,就会发生段错误。发生的位置可能与 bug 的位置无关。
在程序执行到段错误之前的某个时刻,某段代码会破坏堆。这可能是:
- 访问已删除或已释放的指针
- 覆盖数组的边界
- 将对象强制转换为错误的类型并使用它
这些事情都不一定会立即崩溃——它们可能只是默默地破坏内存。稍后,在使用该内存时可能也不会崩溃(只是默默地破坏其他内存)。某个时刻你会崩溃,但这个时间可能与问题完全无关。
除错的策略是让第一次破坏引发崩溃。有几种方法可以做到这一点。
使用调试堆。这里是一些在 Linux 上使用 GCC 的可能性:Debug heap/STL debugging equivalent for GCC?
Valgrind: http://valgrind.org/
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
由于
strkey
是你唯一要比较的字符串,它必须是问题的根源,并且源于堆栈上的char []
。我建议首先摆脱它。std::stringstream str; str << pfunction; string strkey = str.str();
当然,如果你损坏了
this
或者简单地在任何时间和地点损坏了堆,也可能出现这种错误。