memory - Release模式下的 AccessViolationException (C++)

标签 memory managed-c++ access-violation

当我从 Visual C++ 以 Release模式运行我的应用程序时,出现以下异常。

Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. at _cexit() at .LanguageSupport._UninitializeDefaultDomain(Void * cookie) at .LanguageSupport.UninitializeDefaultDomain() at .LanguageSupport.DomainUnload(Object source, Eve ntArgs arguments) at .ModuleUninitializer.SingletonDomainUnload(Objec t source, EventArgs arguments)

在 Debug模式下不会发生这种情况。最初,我在家用电脑上看到了这个异常,但在工作电脑上没有看到。当我继续在我的工作计算机上开发时,我最终遇到了它。

此外,我发现当我添加三个 const std::string 变量时会抛出异常。如果我删除然后一切顺利。

另一条信息:我发现在 Release模式下关闭所有编译器优化会使异常消失

有些可疑的事情正在发生。关于如何追踪这个的任何想法?

感谢您的帮助, 乔

最佳答案

乔,你有一个 memory leak .

您可能正在尝试使用一些已被删除的内存。

参见 this article对于内存泄漏的常见原因,以及如何识别它们,否则,搜索“C++ 内存分析器”+您的编译器/平台,它将提供适合您的编译器和平台的内存分析器的链接,这些将有助于追踪内存通过观察程序在运行时如何使用内存来泄漏。

希望这对您有所帮助。

编辑

如何追踪?这是我的头等大事,其他地方可能会有更好的建议。 . .

找到代码崩溃的地方,它会在访问某个指针的内容(或删除指针)时发生。 问题是该指针要么 a) 从未分配 b) 已被删除。 遍历对该类型指针的所有引用,它们是否用于复制构造函数/赋值运算符?

如果是这样,它是被复制的内容还是只是指针? 如果只是指针那么包含类是否试图删除指针?如果是这样,第一个死亡的类将成功,第二个将抛出访问冲突。

如果您没有显式编码复制 ctors 和 operator=,那么您应该隐藏它们(声明私有(private)原型(prototype)但不实现它们),这会阻止编译器为您生成默认实现。

当你隐藏它们时,你会在使用它们的任何地方遇到编译器错误,可能是你可以清理它们,或者你需要为每个类实现复制构造函数和 operator=。

我从明天或两周开始休假,如果您对此有任何疑问,请今天直接给我发电子邮件(点击我的 SO 用户页面上的链接)。

关于memory - Release模式下的 AccessViolationException (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1074894/

相关文章:

c# - 仅在未附加调试器的情况下运行 C# 应用程序时出现访问冲突异常

javascript - 即内存释放

c++ - 进程终止时是否回收了内存?

ios - 防止在 iOS 中分配类

dll - 从 dll 导出带有 clr 参数的函数?

.net - 托管 C++ 程序集属性

c - asm volatile (""::: "memory") 的生命周期是多少?

.net - Windows 窗体计时器错误或使用不当?

c++ - 如何将字符串(来自具有 n 行的文件)存储在动态数组中? C++

C++ msvcp90d.dll 访问冲突异常