回调中的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()),也会发生这种情况。
没有找到相关结果
已邀请:
2 个回复
豆兢
让我们从头开始研究它:
在上面的1中,WM_LBUTTONDOWN到达WndProc。
在上面的2中,您使用指向堆上新创建的POINT实例的指针调用push_back。
在上面的3中,push_back调用内部函数_Reserve(计数为1)为1
分配内存。这是因为向量为空,因为尚未添加任何元素,并且此特定向量实例分配器的指数增长方案从1开始。(添加另一个元素将重新分配新的内存,并复制第一个元素加上新的元素那里。)
在上面的4中,_Reserve将其调用转发到reserve函数。
在上面的5中,在为第一个
分配了空间之后,reserve看到内部矢量数据指针(在VS 2010中的名称为
)为非空(请参见上面的_Ptr = 0xfefefefefe),因此在将其指向之前刚分配的新空间必须释放0(!)
元素的旧空间。 不幸的是,allocator :: deallocate忽略了0个元素将被释放(可以是一个无操作),并愉快地尝试删除0xfefefefe。
在上面的6中,不幸的是0xfefefefe是已释放内存的VS调试表示,因此请删除扼流圈。它还能做什么? 但是为什么内部向量数据指针为0xfefefefe? 在尝试push_back之前,您实际上对向量做了什么? 您究竟是如何声明向量的? 很奇怪
茂坦湿床够
本来应该
这导致某种内存损坏,因为msgbuf length!= 1024 我真是个混蛋。向所有人致歉