首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么能使不改变地址的Win32 C++指针突然指向无效内存?

什么能使不改变地址的Win32 C++指针突然指向无效内存?
EN

Stack Overflow用户
提问于 2016-07-05 03:58:55
回答 1查看 226关注 0票数 2

我有一个带有内存损坏问题的C++程序,目前正在Visual 2013中进行调试。我正在使用g频标志来帮助找出问题所在:

https://blog.kowalczyk.info/article/1j9/gflags-a-debugging-story.html

我有所有的all,该应用程序拉进来,作为g频标志命令行的一部分。

我是一位经验丰富的C++程序员,曾多次处理指针问题。这个对我来说很奇怪。当跟踪开始时,我会写下指针所指向的内存地址,即显示在“监视”窗口中的地址。

当g频标志触发Visual捕获的断点时,我惊讶地发现内存指针仍然指向完全相同的地址。但是,现在监视窗口显示指针指向的内存区域无效(“错误读取字符在.”)。由于被触发的异常是访问冲突(c0000005),我必须假定指针指向的内存被视为“当前进程之外的内存”。我说的原因是,如果只是内存区域被不适当地分配或释放的问题,地址仍然指向当前进程空间中的内存区域,不应该触发访问冲突。它只是指向随机内容。

换句话说,这不是指针地址本身被破坏或覆盖的通常情况,这会导致指针指向当前进程空间之外的内存。指针的原始地址从分配时起不会改变。

是什么原因导致一个指针的内存地址没有改变,并开始指向进程空间中的有效内存,突然指向被认为无效的内存到触发系统访问冲突的程度?另外,尝试调试问题的最佳方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2016-07-06 15:44:03

这个问题被证明是一个线程冲突,一个线程释放一个共享内存缓冲区,而另一个线程仍在使用。由于@dxiv的评论,他纠正了我对非法访问的看法,我找到了这个问题。

我认为(*错误地)*一个指针触发访问冲突的唯一方法是,如果指针本身被破坏,并被设置为位于它的进程空间之外的内存,或者通过分配无效的地址,或者被被意外地覆盖而损坏的指针。相反,正如dxiv所指出的,如果指针所指向的内存被释放(释放)并随后访问指针,也会触发访问冲突。

有了这些新知识和g频标实用程序,我发现第一个线程正在释放共享内存缓冲区,并修复了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38194980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档