c – 运算符在窗口中重新加载
发布时间:2020-12-16 09:34:49 所属栏目:百科 来源:网络整理
导读:我正在尝试替换全局运算符new和delete.在 Linux中,这工作正常,但在Windows(MSVC 10)中,它有时使用operator new的系统版本进行分配,然后尝试使用operator delete删除它.由于我在分配时存储了一些上下文信息,因此我的运算符delete在重新分配期间期望相同.我如
我正在尝试替换全局运算符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版本. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |