在我的程序的WndProc的回調,我這樣做是爲了保存鼠標點擊的載體:Win32 API的向量問題
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!操作者刪除(無效* pUserData = 0xfefefefe)線52 + 0x3字節C++ my_app.exe!性病::分配器::解除分配(tagPOINT * * _Ptr = 0xfefefefe,unsigned int formal = 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)Line 1298 C++ my_app.exe!std :: vector> :: push_back(tagPOINT * const & _Val = 0x008e9d58)Line 992 C++ my_app.exe!的WndProc(HWND *的hWnd = 0x000b060a,無符號整型消息= 513,無符號整型的wParam = 1,長的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上字節Ç my_app.exe!wWinMainCRTStartup()線371℃ KERNEL32.DLL!764c33ca()
NTDLL.DLL!77e79ed2( )
ntdll.dll的!77e79ea5()
而這正是它在dbgdel.cpp崩潰行(不知道這是有幫助的) /*驗證塊類型*/ _ASSERTE(_BLOCK_TYPE_IS_VALID(PHEAD - > nBlockUse));
@CoreyStup 似乎沒有任何區別,如果瓦爾是局部或全局
也出現這種情況,如果我喜歡叫其他調整大小向量函數(),清除()或儲備(),但不尺寸()。
FWIW您的代碼片段對我來說工作正常。 – 2011-06-14 00:19:22
爲什麼你動態地分配像POINT這樣的小類型?複製可能比傳遞指針快。 – 2011-06-14 02:12:52
崩潰的調用堆棧是什麼? – 2011-06-14 05:24:46