小编nop*_*plk的帖子

为什么标记删除析构函数是因为Windows上的向量删除而被调用的?

我有一个在Windows上泄漏的代码.它在许多unix平台上运行正常,泄漏只发生在Windows上.二进制文件由exe,1 dll和2个静态库组成.exe链接到dll和静态库,而静态库也链接到dll.当代码调用向量删除析构函数时,在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);
}
Run Code Online (Sandbox Code Playgroud)

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

我找到了这个线程 - 为什么矢量删除析构函数是由于标量删除而被调用的?.我按照那里的建议,确保所有模块都使用/ MD编译.

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

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

先感谢您!

c++ debugging destructor memory-leaks vector

6
推荐指数
1
解决办法
2万
查看次数

标签 统计

c++ ×1

debugging ×1

destructor ×1

memory-leaks ×1

vector ×1