【发布时间】:2020-03-10 15:00:21
【问题描述】:
在 MFC 项目中,我使用外部库 TTL 和 overloads operator new。我的问题是我有内存泄漏,我想利用DEBUG_NEW 给出的诊断。但是我只能用 DEBUG_NEW 注释掉来编译它,否则我会得到下面的错误。
下面演示一下。当 Visual Studio 项目作为控制台应用程序制作时,它是一个 MCVE,带有 MFC 标头。
// The problem is when this is uncommented
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
struct HandleId
{
HandleId() {}
void* operator new (size_t t) {
return HandleId::operator new(t, 0, 0, 0);
};
void* operator new (size_t t, int, const char* file, int line) {
HandleId* tmp = (HandleId*)calloc(1, t);
return tmp;
};
void operator delete (void* v) {
free(v);
}
};
namespace hed
{
struct Node : public virtual HandleId
{
Node() {};
Node(double x, double y, double z = 0.0) {}
};
}
struct DtmNode : public hed::Node
{
DtmNode() {};
DtmNode(short pntRef, double x, double y, double z)
: hed::Node(x, y, z)
{};
};
int main()
{
DtmNode* pNode = new DtmNode(0, 1.0, 2.0, 3.0);
return 0;
}
DEBUG_NEW 未注释上述编译失败(VS2019)。
错误 C2661:
HandleId::operator new:没有重载函数需要 3 个参数
到目前为止,我一直使用注释掉的宏。但我现在确实希望在调试版本中使用它,原因很明显,它有助于在调试期间捕获内存泄漏。 DtmNode 是我可以更改的课程。 HandleId 和 hed 命名空间属于该库。
我的问题:
- 有没有办法在
DEBUG_NEW未注释的情况下编译它? - 或者,有没有办法告诉
DtmNode在_DEBUG 模式下不要使用重载的operator new,以便按照“正常”使用DEBUG_NEW?
【问题讨论】:
-
用不会泄漏的东西替换
DtmNode* pNode不是很合理吗?比如std::unique_ptr或std::shared_ptr。
标签: c++ winapi visual-c++ mfc