【问题标题】:Program crashes as soon as I use widestring in C++一旦我在 C++ 中使用宽字符串,程序就会崩溃
【发布时间】:2012-06-29 07:10:56
【问题描述】:

(因为我还没有足够的声望来回答我自己的问题,所以我先把它放在这里。我发布它时没有想清楚。对我来说是凌晨 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,有什么建议吗?

提前致谢

【问题讨论】:

  • 请记住,大多数调试器在加载程序时会清除所有变量,因此您可能需要检查未初始化的变量。
  • 您的数组 wchar_t* txt 是否以空值结尾(以 \0 结尾)?
  • lua_tostring 返回以 null 结尾的 C 字符串。
  • 可能是这样。但实际上我认为这是一个糟糕的问题,我的程序变得太大而不能说这是问题所在,它可能只是其他地方内存泄漏的一个糟糕场景。也许ANSI版本好只是因为我没有使用足够的内存,我听说调试器分配了更多的内存。编辑:刚刚用 ANSI 版本尝试了两倍以上的调用,没有那个问题 o.o
  • 抱歉各位,我发帖的时候没有想清楚。对我来说是凌晨 3 点,我没想到要在别处寻找问题。我正在制作另一个函数来在 lua 中动态添加一个对象,该对象有自己的消息要显示。这就是给我带来问题的那个,所以一旦我静态加载它就可以了。这确实是另一部分代码的问题。

标签: c memory lua widestring


【解决方案1】:

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

所以是的,总有一些其他的可能性,哈哈

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

【讨论】:

    猜你喜欢
    • 2021-08-27
    • 1970-01-01
    • 2017-04-02
    • 2019-04-15
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2012-04-19
    • 2018-08-11
    相关资源
    最近更新 更多