标签:c visual-studio-2010 new-operator
我正在尝试替换全局运算符new和delete.在Linux中,这工作正常,但在Windows(MSVC 10)中,它有时使用operator new的系统版本进行分配,然后尝试使用operator delete删除它.由于我在分配时存储了一些上下文信息,因此我的运算符delete在重新分配期间期望相同.我如何确保窗户始终保持我的运算符新功能?
编辑:
我尝试了各种各样的东西.这些是声明
//Global new and delete overload
void* operator new (std::size_t bytes) throw(...);
void operator delete(void* p) throw();
void* operator new( std::size_t size, const std::nothrow_t&) throw();
void operator delete( void* mem, const std::nothrow_t&) throw();
void* operator new[] ( std::size_t bytes) throw(...);
void operator delete[](void* p) throw();
void* operator new[]( std::size_t size, const std::nothrow_t&) throw();
void operator delete[](void* mem, const std::nothrow_t&) throw();
#ifdef WIN32
void *__CRTDECL operator new(std::size_t size) _THROW1(_STD bad_alloc);
#endif
这些是定义
#ifdef WIN32
void *__CRTDECL operator new(std::size_t bytes) _THROW1(_STD bad_alloc)
{
void* p = edb::g_getCurrentMemoryContext()->alloc(bytes);
if (p==0) // did malloc succeed?
throw std::bad_alloc(); // ANSI/ISO compliant behavior
return p;
}
#endif
void operator delete(void* p) throw()
{
edb::MemContext::free(p);
}
void* operator new( std::size_t bytes, const std::nothrow_t&) throw()
{
return edb::g_getCurrentMemoryContext()->alloc(bytes);
}
void operator delete(void* p, const std::nothrow_t&) throw()
{
edb::MemContext::free(p);
}
void* operator new[] ( std::size_t bytes) throw(...)
{
void* p = edb::g_getCurrentMemoryContext()->alloc(bytes);
if (p==0) // did malloc succeed?
throw std::bad_alloc(); // ANSI/ISO compliant behavior
return p;
}
void operator delete[](void* p) throw()
{
edb::MemContext::free(p);
}
void* operator new[]( std::size_t bytes, const std::nothrow_t&) throw()
{
return edb::g_getCurrentMemoryContext()->alloc(bytes);
}
void operator delete[](void* p, const std::nothrow_t&) throw()
{
edb::MemContext::free(p);
}
有时它会提升我的定义,有时它却没有.
谢谢,
戈库尔.
解决方法:
覆盖C中的全局新/删除是一个tar baby.是的,它看起来很简单,但是接着你做了一个例外,你继续为自己挖掘更深的洞.
你得到’他们的新’和’你的删除’的原因是你可能正在使用一些已加载的DLL,并在你的加载之前“链接”到现有的新版本.他们分配对象然后你应该删除它.你可以尝试静态链接你的程序来解决这个问题.
另一种处理方法是重构代码并覆盖new / delete作为基类,然后使所有类继承自该类.对于一个包含大量类的大型项目来说很繁琐,但它会消除哪些新的/删除被调用的人的歧义.
如果你这样做是一种可能是“廉价”的隔离内存泄漏的方法,那么请考虑别的事情.查看是否有任何仪器工具供应商(例如,净化)仍然进行’2周’试用或通过valgrind运行您的Linux版本.
标签:c,visual-studio-2010,new-operator 来源: https://codeday.me/bug/20190730/1578396.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。