gpt4 book ai didi

c++ - 带字符串的 map 坏了?

转载 作者:行者123 更新时间:2023-11-30 04:36:27 24 4
gpt4 key购买 nike

是的。我看不出我做错了什么。

映射为:string, int

方法是这样的

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::scene继承自 bange::function .我用 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 垃圾回收。现在访问 bange::function::Add来自 Lua:

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;
}

用户数据 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 (我承认,指针损坏)这似乎更像是一个代码设计问题。所以这在某种程度上已经解决了。谢谢大家。

最佳答案

由于 strkey 是您曾经比较过的唯一字符串,它一定是问题的根源,它源自堆栈上的 char[]。我将从摆脱它开始。

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

当然,如果您破坏了 this,或者实际上,如果您随时随地破坏了堆,也可能会发生此错误。

关于c++ - 带字符串的 map 坏了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4538898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com