加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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版本.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读