gpt4 book ai didi

c++ - 为什么在 Windows 上由于 vector 删除而调用标量删除析构函数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:35:59 25 4
gpt4 key购买 nike

我有一个在 Windows 上泄漏的代码。它在许多 unix 平台上运行良好,泄漏只发生在 Windows 上。二进制文件由 exe、1 个 dll 和 2 个静态库组成。 exe 链接到 dll 和静态库,而静态库也链接到 dll。当由于某种原因调用标量删除析构函数而不是调用 vector 删除析构函数时,exe 代码中会发生泄漏。这导致仅删除数组中的第一个对象,而数组的其余部分保留在内存中。

泄漏的伪代码如下所示:

class MyClassFromExe : public MyBaseClassFromDll {
public:
ClassFromDll* m_arr;

MyClassFromExe(unsigned int size)
{
m_arr = new ClassFromDll[size];
}

~MyClassFromExe()
{
delete [] m_arr;
}
};

void func()
{
MyClassFromExe obj(3);
}

当 func() 完成并调用析构函数时,我看到只有 m_arr 中第一个对象的析构函数被调用。从调试器中我看到这是通过标量删除析构函数而不是 vector 删除析构函数完成的。这解释了为什么只有第一个对象被销毁。我需要理解的是为什么在使用 delete [] 时调用标量删除析构函数???

我找到了这个线程 - Why is vector deleting destructor being called as a result of a scalar delete? .我听从了那里的建议,并确保所有模块都是用/MD 编译的。

重要的是要注意,当包含 ClassFromDll 的 dll 是静态库而不是 dll 时,一切正常。泄漏仅在静态库更改为 dll 时才开始。当程序在 Release 模式下泄漏时,它在 delete [] m_arr 时在 Debug 模式下崩溃。崩溃发生在 dbgdel.cpp 第 52 行 - _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)。

在 unix 平台上,这个库也是一个共享库,正如预期的那样, vector 删除析构函数被调用并且没有泄漏。问题可能出在VC编译器上吗?或者可能需要更改项目的其他一些设置?我正在使用 VC2003。

提前致谢!

最佳答案

这是 VC++ 中关于 DLL 和对象数组的老问题。正如 Microsoft 所解释的那样,原因是编译器优化不正确。

http://support.microsoft.com/kb/121216/en-us

最好使用 STL 容器,它不会因为使用分配器而出现问题。

关于c++ - 为什么在 Windows 上由于 vector 删除而调用标量删除析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4948339/

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