运维开发网

C语言 运算符在窗口中重新加载

运维开发网 https://www.qedev.com 2020-05-09 09:41 出处:网络 作者:运维开发网整理
我正在尝试替换全局运算符new和delete.在 Linux中,这工作正常,但在Windows(MSVC 10)中,它有时使用operator new的系统版本进行分配,然后尝试使用operator delete删除它.由于我在分配时存储了一些上下文信息,因此我的运算符delete在重新分配期间期望相同.我如何确保窗户始终保持我的运算符新功能? 编辑: 我尝试了各种各样的东西.这些是声明 //Gl
我正在尝试替换全局运算符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版本.

0

精彩评论

暂无评论...
验证码 换一张
取 消