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.
{
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.
改成TCHAR str[16];就可以了但是这样长度就固定了~有没其他的办法!
2. 动态分配
CString::ReleaseBuffer
怎么用?
但是这样长度就固定了~
====================================================TCHAR str[len]; 只要len的长度足够大,wsprintf(str, _T("x:%d y:%d"), cPoint.x, cPoint.y);就不会溢出,一般len为30足够,多余部分占用的内存简直可以忽略不计。
TCHAR str[256];
TCHAR* str = new TCHAR[100];
有什么区别呢?或者怎么选择使用哪个好?
栈上分配必须指明大小,也就是静态分配,因为编译器必须知道block里每个变量的偏移
堆上分配则是从进程的堆中分配,在运行时调用malloc(API: HeapAlloc)从某个堆中来进行分配,所以分配的大小可以在运行时决定.另外, new 出来的东西要记得delete,这跟C#, JAVA可不一样
------------------------------------------------
局部的方法完了就没有了?会自动回收么?
在栈中使用局部变量,空间应该往大的留
随着程序段{}的结束,系统会自动回收栈空间,不会有内存泄漏问题
所以你的str[] = ""实际上是未分配内存,后面的wsprintf要往一块长度是零的内存里写东西,当然会发生溢出!这时候,debug的自动内存检查机制就会起作用报出一个错。
但release版则对速度做了优化没有内存检测功能。所以,你的release没有提示出错,但实际上wsprintf(str, _T("x:%d y:%d"), cPoint.x, cPoint.y);这句已经溢出了。因为str的大小是零!
那TCHAR str[] = _T("11111");这样呢?