В обратном вызове 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! operator delete (void * pUserData = 0xfefefefe) Строка 52 + 0x3 байта C ++ my_app.exe! std :: allocator :: deallocate (tagPOINT * * _Ptr = 0xfefefefe, unsigned 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, wc har_t * lpCmdLine = 0x006c35d2, int nCmdShow = 1) Строка 62 + 0xc байтов C ++ my_app.exe! __ tmainCRTStartup () Строка 547 + 0x2c байтов C my_app.exe! wWinMainCRTStartup () Строка 371c kernel32ca () 764 ntdll.dll! 77e79ed2 ()
ntdll.dll! 77e79ea5 ()
И это строка, в которой происходит сбой в dbgdel.cpp (не уверен, что это полезно) / * проверка типа блока * / _ASSERTE (_BLOCK_TYPE_IS_VALID (pHead-> nBlockUse));
@CoreyStup Кажется, нет никакой разницы, являются ли вары локальными или глобальными
Также это происходит, если я вызываю другие векторные функции, такие как resize (), clear () или reserve (), но не size ().
POINT
? Копирование, вероятно, происходит быстрее, чем передача указателя. - person Ben Voigt   schedule 14.06.2011