C++ 之后崩溃调试 DLL 中的内存分配

发布于 2024-12-19 07:08:29 字数 567 浏览 1 评论 0原文

我有一个类驻留在一个 dll 和一个使用该 dll 的 exe 中。 Exe 只是在 dll 中创建类并调用其方法。在发布模式下编译时一切正常。但是,如果我使用 MDd 标志在调试模式下编译所有内容(包括我的类使用的 OpenCV 库),那么我会得到:

Debug Assertion Failed! _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

所有涉及的二进制文件都使用完全相同版本的运行时 dll,并且所有内容都在同一台计算机上使用 VS 2008 进行编译据我了解(根据我的调试),问题如下:

我正在使用 exe 中的“new”运算符(在 main 下)创建我的类的实例,然后一旦我的类的构造函数执行某些操作,我就会创建一个类的实例。需要内存分配,类本身的内存位置被覆盖,就好像 dll 和 exe 使用相同的内存空间但不同的“要分配的下一个可用位置”偏移量一样。因此,dll看不到exe内部已经完成了分配,因此覆盖了我的类所在的内存区域。显然这会导致内存问题。

知道为什么会发生这种情况吗?我尽力解释了情况,但如果需要,我当然可以提供更多信息。

提前致谢。

I have a class residing inside of a dll and an exe using that dll. Exe simply creates the class within the dll and call its methods. Everything works fine when compiled in release mode. But if I compile everything (including the OpenCV library my class uses) in debug mode with MDd flag then I get:

Debug Assertion Failed! _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

All of the binaries involved are using the exact same version of the runtime dlls and everything is compiled on the same computer with VS 2008. As far as I understand (based on my debuggings) the problem is the following:

I am creating an instance of my class using the "new" operator in the exe (under main) then as soon as the constructor of my class does something requiring a memory allocation, memory location of the class itself is overwritten as if both the dll and exe are using the same memory space but different "next available position to allocate" offsets. Therefore the dll does not see that there was already an allocation done inside of the exe hence overwriting the memory area my class resides. Clearly this causes a memory problem.

Any idea why can this happen? I tried my best to explain the situation but I can of course provide more info if required.

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

森林很绿却致人迷途 2024-12-26 07:08:29

请检查那些调试宏,这很重要。像 ASSERT 这样的东西...

它们在调试模式下编译。

当您在发布模式下编译代码时,调试宏将被禁用。

Please check those DEBUG MACROs, It's crucial. Something like ASSERT...

They are compiled when in debug mode.

When you compile code in release mode, debug MACROs are disabled.

一生独一 2024-12-26 07:08:29

我发现问题是由于我的错误,类的头文件中缺少了 2 个公共成员变量。当我添加它们时,问题就解决了。

I found out that the problem was 2 public member variables that were missing from the header file of the class by my mistake. When I added them, the problem is solved.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文