我在删除指针时遇到读取访问冲突[关闭]
Posted
技术标签:
【中文标题】我在删除指针时遇到读取访问冲突[关闭]【英文标题】:I'm getting read access violation while deleting pointer [closed] 【发布时间】:2016-01-19 09:36:41 【问题描述】:C03View::~C03View()
delete pBrush_;//this causes read access violation.
抛出异常:读取访问冲突。 this->pBrush_-> 是 0xDDDDDDDD。
我的代码中只有一个地方初始化了这个对象:
void C03View::OnInitialUpdate()
CScrollView::OnInitialUpdate();
pRenderTarget_ = GetRenderTarget();
pBrush_ = new CD2DSolidColorBrush(GetRenderTarget(),
D2D1::ColorF(D2D1::ColorF::Blue));
这个项目是一个 MFC 项目。
非常感谢任何帮助。
【问题讨论】:
它可能被不相关的溢出覆盖(它发生在我见过的一些代码中)。在 pBrush_ 上设置观察点以检测谁更改了它的值。 你确定你不在代码的其他地方delete pBrush_
吗? VS 使用位模式0xDDDDDDDD
来标记已释放的内存。
@BlackDwarf 绝对不会在其他任何地方删除它。代码只是一个小的启动项目,所以我可以确定。
@LucaPizzamiglio 你如何在 VS 中设置观察点?你是说断点吗?
@Thereisnothingwecando 在VS的断点面板中应该可以设置watchpoint,一种断点,如果特定内存区域的值发生变化就会中断执行
【参考方案1】:
可能的情况:
pBrusch_
在构造 C03View 时未初始化且从未分配(从未调用 OnInitialUpdate)
pBrusch_
因内存损坏而被覆盖
pBrusch_
之前已被删除,但之后未设置为 NULL
pBrusch_
在自己的析构函数中崩溃
C03View
的对象已损坏或未分配,但调用了析构函数
...
【讨论】:
以上是关于我在删除指针时遇到读取访问冲突[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
task2.exe 中 0x001066F6 处未处理的异常:0xC0000005:访问冲突读取位置 0x0000000C [关闭]
当我通过删除临时节点来释放内存时,我遇到了读取访问冲突。但只有当我返回虚假陈述时