И "точка", и "точка_вектор" ... кажутся действительными в отладчике.
- Как вы думаете, по какой мере они действительны? Коллстак подразумевает обратное.
- Как это выглядит до того, как вы попробуете 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 выше вы вызываете push_back с указателем на вновь созданный экземпляр POINT в куче.
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 перенаправляет свой вызов резервной функции.
5. my_app.exe!std::allocator::deallocate(tagPOINT * * _Ptr=0xfefefefe, unsigned int formal=0) Line 182 + 0x9 bytes C++
В 5 выше, после выделения места для первого POINT*
, резерв видит, что внутренний указатель векторных данных (в VS 2010 его имя _Myfirst
) не равно нулю (см. _Ptr = 0xfefefefe выше), поэтому перед наведением его на только что выделенное пространство, старое пространство 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?
- Как именно вы объявили вектор?
Странно это.