gpt4 book ai didi

c++ - Boost 在重载新/删除运算符时导致无效 block

转载 作者:行者123 更新时间:2023-11-30 04:36:27 24 4
gpt4 key购买 nike

我有一个问题,似乎是在对 Boost:runtime:cla::parser::~parser 的 Boost 调用期间发生的无效内存块。当对该对象调用该全局删除时,C++ 断言该内存块无效:

dbgdel.cpp(52):

/* verify block type */
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

我所做的一项调查表明,问题的发生是由于新/删除运算符的全局重载。这些重载放在一个单独的 DLL 中。我发现只有当该 DLL 在 RELEASE 中编译而主应用程序在 DEBUG 中编译时才会出现问题。

所以我认为发布/调试构建风格可能会在重载新/删除运算符时在 Boost/CRT 中产生这样的问题。因此,即使在 Release模式下,我也尝试使用重载函数显式调用 _malloc_dbg 和 _free_dbg,但它并没有解决无效堆 block 问题。

知道问题的根本原因是什么吗?这种情况可以解决吗?

我应该强调的是,这个问题是在我开始使用 Boost 时才出现的。在此之前,CRT 从未提示过任何无效的内存块。那么这可能是内部 Boost 错误吗?

谢谢!

最佳答案

I discovered that the problem happens only when that DLL is compiled in RELEASE while the main application is compiled in DEBUG

如果来自一种运行时的内存分配被另一种运行时释放,通常您不能将使用发布 CRT 的模块与调试 CRT 混合使用(可能还有其他问题,但内存分配问题似乎最常出现) .

解决方案是相互使用针对调试运行时构建的模块,以及针对发布运行时构建的模块——不要将两者混用。

Microsoft 的解释可以在这里找到:http://msdn.microsoft.com/en-us/library/ms235460.aspx

because each copy of the CRT library has its own heap manager, allocating memory in one CRT library and passing the pointer across a DLL boundary to be freed by a different copy of the CRT library is a potential cause for heap corruption.

关于c++ - Boost 在重载新/删除运算符时导致无效 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4544423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com