代码之家  ›  专栏  ›  技术社区  ›  aritosteles

修改结构后应用程序崩溃[已关闭]

  •  0
  • aritosteles  · 技术社区  · 10 年前

    我遇到了一个编译正常但在启动时甚至在到达InitInstance()之前就崩溃的项目的问题。 这发生在我将字符串添加到结构后:

    typedef struct
    {
    long            nChannelIndex;
    TCHAR           szChannelName[32];
    DWORD           dwStartTime;        // time_t
    DWORD           dwPlaytimeMs;       // msecs
    TCHAR           szStepName[32];
    TCHAR           szFilename[MAX_PATH];
    long            nLenMs;
    TCHAR           szStepDescr[64];
    DWORD           dwSessionID;
    TCHAR           szLocationName[32];
    long            bInsertion;
    BOOL            nOrigin;        // 0= local,  1= cuemaster,
    TCHAR           szList[32];
    TCHAR           szFSPath[MAX_PATH];  <<  THIS HERE IS THE PROBLEM
    }REPORTDATA, *LPREPORTDATA;
    

    我在chkstk撞车了。asm-关于此代码:

    ; Find next lower page and probe
    cs20:
    sub     eax, _PAGESIZE_         ; decrease by PAGESIZE
    test    dword ptr [eax],eax     ; probe page.
    jmp     short cs10
    

    我正在windows 7 Ultimate 64位上编译一个32位c++应用程序。2010年硕士。

    我没有要求调试我的代码。只需包含代码以显示引发崩溃的原因和发生的位置。

    有什么想法吗? 谢谢你的帮助!

    2 回复  |  直到 10 年前
        1
  •  1
  •   Mark Ransom    10 年前

    发生崩溃的模块的名称 chkstk.asm 是正在发生的事情的线索。它正在检查堆栈分配,以确保没有用完。看来你 有 通过在结构中添加一个大型新元素来运行。使用单个结构很难耗尽堆栈空间,所以我假设您有一个它们的数组。局部变量是分配给堆栈的,因此问题可能是包含这些结构数组的局部变量。

    您可以使用 /F compiler switch .

    您还可以使用 vector 而不是数组,它将在堆中而不是堆栈上分配空间。

        2
  •  0
  •   1stCLord    10 年前

    编辑: 通常(但不一定)存储局部变量的堆栈在应用程序中是有限大小的,它通常在创建线程时分配,并且可以使用pthread_attr_setstacksize等操作系统函数进行配置,如果堆栈空间不足,可以选择扩大正在处理的线程上的堆栈,尽管这通常不是一个好主意。

    这个问题最简单、最安全的解决方案是通过调用C malloc或C++new在堆上分配大数据。堆通常比堆栈大很多数量级,但在处理完数据后需要显式的无C或C++删除,在本地范围结束后,它不会像堆栈变量那样被清除。

    注意,堆变量的主要问题是它们会泄漏,例如,通过抛出提前退出的函数。这就是为什么建议在处理堆对象时使用std::unique_ptr存储它,这符合 RAII 概念