一旦我在C ++中使用宽字符串,程序就会崩溃

时间:2012-06-29 07:10:57

标签: c memory lua widestring

(因为我还没有足够的声誉来回答我自己的问题,我会先把它放在这里。当我发布它时,我并没有直接思考。对我来说是凌晨3点,没有发生让我到别处寻找问题。

我正在制作另一个函数来动态添加lua中的对象,该对象有自己的消息要显示。这就是给我带来问题的那个,所以一旦我静态加载它就没关系了。这确实是代码的另一部分的问题。)

我在这里遇到了一个非常奇怪的问题

我的C ++代码使用lua(没有boost库),所以它可以从lua检索变量等,lua可以调用已注册的C函数。

现在我有两个版本的函数,一个用于ANSI,另一个用于Unicode(中文)。 ANSI版本似乎工作正常,它不会破坏。问题出在unicode版本上。

我设法用ANSI格式对unicode进行解密,所以这一切都很好。 现在的问题是它可以正常工作几次,但是当我多次重复相同的lua代码时,程序会崩溃。 我仍然无法判断lua堆栈是否存在问题,或者仅仅是内存问题。

这是代码首先给代码,这是我把它缩小到

int l_showMSG(lua_State *l)
{
    printf("showMSG::begin\n");

    SDL_SemWait(msgLock);
    char* fontname = (char*) lua_tostring(mainL,-1); lua_pop(mainL,1);
    wchar_t* txt = (wchar_t *) lua_tostring(mainL,-1);

    wstring msg = wstring(txt);  //this is the code that breaks

    lua_pop(mainL,1);
    SDL_SemPost(msgLock);
    printf("showMSG::done\n"); //it seens to get here or break in the line above depending on what I uncomment in my actual code o.o
    return 0;
}

因此,经过几小时的printf和测试,我发现wstring msg = wstring(txt)是打破它的行。

我通过使用widestringstream来解决这个问题,这至少不会在这里崩溃(尽管我仍然必须修复其他函数以使用widestringstream来使其工作,可能)

但是只要我添加一行就行了     wstring msg = buf.str()// buf是流 同样的问题也会发生。

所以我想知道,这可能是为什么会发生这种情况的原因?当我在Code :: Blocks中启用调试模式时,它工作正常,但显然这不是一个好的解决方案,我在Windows中,所以我也不能使用Valgrind,任何建议?

提前致谢

1 个答案:

答案 0 :(得分:0)

我终于找到了, 所以这是另一个问题造成的。 我正在使用lua动态地将一个对象添加到屏幕上,这会进入一个单独的列表,所以当我访问这些单独列表中的元素时,某些东西可能会覆盖某个地方,而问题只会在以后尝试显示文本时出现

所以是的,总有一些其他的可能性,大声笑

永远不要相信你在凌晨3点的工作o.o