gpt4 book ai didi

c++ - 使用我的 DLL 的应用程序中新建/删除的奇怪问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:40:18 27 4
gpt4 key购买 nike

抱歉,问题标题含糊不清。我有一个奇怪的问题,我不知道为什么会这样。幸运的是,所涉及的代码非常简单。但在开始之前,让我简要介绍一下我的应用程序。它是一个提供大量数据的多线程应用程序。类似于内存数据库。可以在其中有多个“数据库”并在运行时加载/卸载它们。现在问题出在内存释放上。请参阅下面的代码(类名等已更改,但这无关紧要):

void SS::AllocTree( double*** pba, int i, int d, int b, int split )
{
this->m_tree = new my_tree( pba, i, d, b, split );
}

void SS::DeallocTree()
{
delete this->m_tree;
this->m_tree = NULL;
}

每次调用 delete this->m_tree 时,程序都会崩溃。堆栈跟踪看起来像这样:

     mydll.dll!_free_base(void * pBlock=0x0000000008496f70)  Line 109 + 0x14 bytes  C
mydll.dll!_free_dbg_nolock(void * pUserData=0x0000000008496fa0, int nBlockUse=0x00000001) Line 1428 C++
mydll.dll!_free_dbg(void * pUserData=0x0000000008496fa0, int nBlockUse=0x00000001) Line 1258 + 0xe bytes C++
mydll.dll!operator delete(void * pUserData=0x0000000008496fa0) Line 54 + 0x12 bytes C++
mydll.dll!my_tree::`vector deleting destructor'() + 0x94 bytes C++
myprog.exe!SS::DeallocTree() Line 57 + 0x34 bytes C++
myprog.exe!SSUnloader(void * arg=0x00000000084d6f80) Line 1038 C++
msvcr90d.dll!_callthreadstart() Line 295 C
msvcr90d.dll!_threadstart(void * ptd=0x00000000084dad30) Line 277 C

这是分配树的堆栈跟踪:

     msvcr90d.dll!malloc(unsigned __int64 nSize=0x0000000000000058)  Line 56 + 0x21 bytes   C++
msvcr90d.dll!operator new(unsigned __int64 size=0x0000000000000058) Line 59 + 0xa bytes C++
myprog.exe!SS::AllocTree(double * * * pba=0x0000000008458ff0, int i=0x00000bde, int d=0x00000010, int b=0x00000008, int split=0x00000001) Line 52 + 0xa bytes C++
myprog.exe!SSLoader(void * arg=0x000000000843cf80) Line 932 C++
msvcr90d.dll!_callthreadstart() Line 295 C
msvcr90d.dll!_threadstart(void * ptd=0x0000000008440d30) Line 277 C

如您所见,加载/卸载是由专门为此任务创建的单独线程完成的。不过,我没有使用任何奇特的东西,没有自定义堆或任何东西,在我的 dll 或程序中没有自定义运算符 new/delete。我不知道为什么程序会进入我的 dll 并在那里调用 delete,但是对于 new,这不会发生。如果我将 DeallocTree() 更改为如下所示:

void SS::DeallocTree()
{
::operator delete( this->m_tree );
this->m_tree = NULL;
}

然后一切正常。但是,我不确定这是否正确。我不应该为 operator new 做类似的事情吗?我怎么能确定同样的问题不会发生在其他地方?为了完整起见,我还附上了这个版本的 DeallocTree() 的堆栈跟踪:

    msvcr90d.dll!operator delete(void * pUserData=0x00000000086f5fa0)  Line 45 + 0xa bytes  C++
myprog.exe!SS::DeallocTree() Line 58 C++
myprog.exe!SSUnloader(void * arg=0x0000000008735f80) Line 1038 C++
msvcr90d.dll!_callthreadstart() Line 295 C
msvcr90d.dll!_threadstart(void * ptd=0x0000000008739d30) Line 277 C

谁能给我解释一下这是怎么回事?

编辑:
澄清:
my.dll 动态加载 - VS 2008 输出:myprog.exe': 已加载 'C:*\Debug\mydll.dll',已加载符号。
注意:我正确地将调试版本的 dll 与我的程序的调试版本一起使用,反之亦然。
**my_tree 声明为:
my_tree* m_tree;//树

最佳答案

好吧,线索似乎在调用堆栈中。在“删除”调用堆栈中,您会注意到它直接在 mydll.dll 中调用各种删除函数等。在分配中,分配由 msvcr90d.dll 执行。

您拥有的是在您的 exe 上设置的/MDd(或发布中的/MD)标志和在您的 dll 上设置的/MTd(或发布中的/MT)。将它们都设置为/MDd(或发布中的/MD),你的问题就会消失......基本上你将同时设置 exe 和 dll 来调用 CRT dll 而不是尝试执行它 2 不同方式...

关于c++ - 使用我的 DLL 的应用程序中新建/删除的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4302008/

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