回调中的Win32 API向量问题

| 在我程序的WndProc回调中,我这样做是为了在矢量中存储鼠标单击:
case WM_LBUTTONDOWN:
    point = new POINT();
    point->x = LOWORD (lParam);
    point->y = HIWORD (lParam);

    point_vector.push_back(point);

    InvalidateRect(hWnd, NULL, TRUE);
    break;
编译正常,但是运行时,我在“ push_back \”上遇到访问冲突。 \“ point \”和\“ point_vector \”都是全局声明的,并且在调试器中似乎有效。如果我在本地声明它们,则不会发生访问冲突。为什么会这样? 这是在VS10上。 马丁·洛夫(Martyn Lovell) 这是调用堆栈   msvcr100d.dll!运算符删除(void * pUserData = 0xfefefefe)第52行+ 0x3字节C ++       my_app.exe!std :: allocator :: deallocate(tagPOINT * * _Ptr = 0xfefefefefe,无符号int形式= 0)行182 + 0x9字节C ++       my_app.exe!std :: vector> :: reserve(unsigned int _Count = 1)行768 C ++       my_app.exe!std :: vector> :: _ Reserve(unsigned int _Count = 1)行1298 C ++       my_app.exe!std :: vector> :: push_back(tagPOINT * const&_Val = 0x008e9d58)992行C ++       my_app.exe!WndProc(HWND * hWnd = 0x000b060a,unsigned int message = 513,unsigned int wParam = 1,long lParam = 19857987)第241行C ++       user32.dll!774662fa()       [下面的框架可能不正确和/或丢失,没有为user32.dll加载任何符号]       user32.dll!77466d3a()       user32.dll!77466ce9()       user32.dll!77466e44()       user32.dll!774677c4()       user32.dll!7746788a()       my_app.exe!wWinMain(HINSTANCE__ * hInstance = 0x00c80000,HINSTANCE__ * hPrevInstance = 0x00000000,wchar_t * lpCmdLine = 0x006c35d2,int nCmdShow = 1)62行+ 0xc字节C ++       my_app.exe!__ tmainCRTStartup()第547行+ 0x2c字节C       my_app.exe!wWinMainCRTStartup()行371 C       kernel32.dll!764c33ca()       ntdll.dll!77e79ed2()       ntdll.dll!77e79ea5() 这是它在dbgdel.cpp中崩溃的行(不确定是否有帮助) / *验证块类型* / _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)); @CoreyStup 如果var是本地的或全局的,似乎没有什么区别 如果我调用其他向量函数(如resize(),clear()或reserve()而不是size()),也会发生这种情况。     
已邀请:
           \“ point \”和\“ point_vector \” ...在调试器中似乎都是有效的。 您认为这些措施有效吗?调用栈的含义相反。 第一次尝试push_back之前,它是什么样的? 这是调用栈的顶部:
6. msvcr100d.dll!operator delete(void * pUserData=0xfefefefe) Line 52 + 0x3 bytes C++
5. my_app.exe!std::allocator::deallocate(tagPOINT * * _Ptr=0xfefefefe, unsigned int formal=0) Line 182 + 0x9 bytes C++
4. my_app.exe!std::vector >::reserve(unsigned int _Count=1) Line 768 C++
3. my_app.exe!std::vector >::_Reserve(unsigned int _Count=1) Line 1298 C++
2. my_app.exe!std::vector >::push_back(tagPOINT * const & _Val=0x008e9d58) Line 992 C++
1. my_app.exe!WndProc(HWND * hWnd=0x000b060a, unsigned int message=513, unsigned int wParam=1, long lParam=19857987) Line 241 C++
让我们从头开始研究它:
1. my_app.exe!WndProc(HWND * hWnd=0x000b060a, unsigned int message=513, unsigned int wParam=1, long lParam=19857987) Line 241 C++
在上面的1中,WM_LBUTTONDOWN到达WndProc。
2. my_app.exe!std::vector >::push_back(tagPOINT * const & _Val=0x008e9d58) Line 992 C++
在上面的2中,您使用指向堆上新创建的POINT实例的指针调用push_back。
3. my_app.exe!std::vector >::_Reserve(unsigned int _Count=1) Line 1298 C++
在上面的3中,push_back调用内部函数_Reserve(计数为1)为1
POINT*
分配内存。这是因为向量为空,因为尚未添加任何元素,并且此特定向量实例分配器的指数增长方案从1开始。(添加另一个元素将重新分配新的内存,并复制第一个元素加上新的元素那里。)
4. my_app.exe!std::vector >::reserve(unsigned int _Count=1) Line 768 C++
在上面的4中,_Reserve将其调用转发到reserve函数。
5. my_app.exe!std::allocator::deallocate(tagPOINT * * _Ptr=0xfefefefe, unsigned int formal=0) Line 182 + 0x9 bytes C++
在上面的5中,在为第一个
POINT*
分配了空间之后,reserve看到内部矢量数据指针(在VS 2010中的名称为
_Myfirst
)为非空(请参见上面的_Ptr = 0xfefefefefe),因此在将其指向之前刚分配的新空间必须释放0(!)
POINT*
元素的旧空间。 不幸的是,allocator :: deallocate忽略了0个元素将被释放(可以是一个无操作),并愉快地尝试删除0xfefefefe。
6. msvcr100d.dll!operator delete(void * pUserData=0xfefefefe) Line 52 + 0x3 bytes C++
在上面的6中,不幸的是0xfefefefe是已释放内存的VS调试表示,因此请删除扼流圈。它还能做什么? 但是为什么内部向量数据指针为0xfefefefe? 在尝试push_back之前,您实际上对向量做了什么? 您究竟是如何声明向量的? 很奇怪     
        好,解决了在程序的另一部分中,我正在调用:
_stprintf_s(msgbuf, 1024, _T(\"Mouse coordinates: %d %d\\0\"), mouse.x, mouse.y);
本来应该
_stprintf_s(msgbuf, sizeof(msgbuf), _T(\"Mouse coordinates: %d %d\\0\"), mouse.x, mouse.y);
这导致某种内存损坏,因为msgbuf length!= 1024 我真是个混蛋。向所有人致歉     

要回复问题请先登录注册