OnMouseMove(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
POINTS curPoint = MAKEPOINTS(lParam);
POINT cPoint;
cPoint.x = curPoint.x;
cPoint.y = curPoint.y;
TCHAR str[] = _T("");
wsprintf(str, _T("x:%d y:%d"), cPoint.x, cPoint.y);
::TextOut(GetDC(hWnd), 0, 0, str, lstrlen(str));
}为什么上面的代码在Release下很正常,但在Debug下却会出现下面的错误呢?Run-Time Check Failure #2 - Stack around the variable 'str' was corrupted.

解决方案 »

  1.   

    TCHAR str[20] = _T("");
      

  2.   

    我把TCHAR str[] = _T("");
    改成TCHAR str[16];就可以了但是这样长度就固定了~有没其他的办法!
      

  3.   

    1. 用CString
    2. 动态分配
      

  4.   

    CStringCString::GetBuffer
    CString::ReleaseBuffer
      

  5.   

    但是这样长度就固定了~有没其他的办法!malloc or new
      

  6.   

    TCHAR str[20] = _T(""); 都是这么用的,要么用string
      

  7.   

    给个例子好不?还有就是为什么Release下没问题呢?
      

  8.   

    malloc or new
    怎么用?
      

  9.   

    改成TCHAR str[16];就可以了
    但是这样长度就固定了~
    ====================================================TCHAR str[len]; 只要len的长度足够大,wsprintf(str, _T("x:%d y:%d"), cPoint.x, cPoint.y);就不会溢出,一般len为30足够,多余部分占用的内存简直可以忽略不计。
      

  10.   

    但是某些情况下长度不知道,如果定得很大,那不就浪费了?////////////////////////////////////////////////////////那就用指针,长度知道了再NEW
      

  11.   

    为什么上面的代码在Release下很正常,但在Debug下却会出现下面的错误呢?
      

  12.   

    顺便问一下
    TCHAR str[256];
    TCHAR* str = new TCHAR[100];
    有什么区别呢?或者怎么选择使用哪个好?
      

  13.   

    一个是栈上分配, 另一个是堆上分配
    栈上分配必须指明大小,也就是静态分配,因为编译器必须知道block里每个变量的偏移
    堆上分配则是从进程的堆中分配,在运行时调用malloc(API: HeapAlloc)从某个堆中来进行分配,所以分配的大小可以在运行时决定.另外, new 出来的东西要记得delete,这跟C#, JAVA可不一样
      

  14.   

    cstring或者数组大小写大点,局部的方法完了就没有了
      

  15.   

    TO:jasonshark(最后一个暑假了...)   GOOD!!----------------------------------------
      

  16.   

    TO:ggglivw() 数组大小写大点,局部的方法完了就没有了
    ------------------------------------------------
    局部的方法完了就没有了?会自动回收么?
      

  17.   

    同意ggglivw()
    在栈中使用局部变量,空间应该往大的留
    随着程序段{}的结束,系统会自动回收栈空间,不会有内存泄漏问题
      

  18.   

    不会有问题的,只要没有new,就不会泄露
      

  19.   

    VC的Debug版会在变量的前后插入一些数据,用来检查是否有溢出或者未翻译等操作。
    所以你的str[] = ""实际上是未分配内存,后面的wsprintf要往一块长度是零的内存里写东西,当然会发生溢出!这时候,debug的自动内存检查机制就会起作用报出一个错。
    但release版则对速度做了优化没有内存检测功能。所以,你的release没有提示出错,但实际上wsprintf(str, _T("x:%d y:%d"), cPoint.x, cPoint.y);这句已经溢出了。因为str的大小是零!
      

  20.   

    release下没有异常检查了,好像
      

  21.   

    我想问下TCHAR str[] = _T("");这样没有分配内存吗?
    那TCHAR str[] = _T("11111");这样呢?