美文网首页
c++ new 与 delete

c++ new 与 delete

作者: linanwx | 来源:发表于2018-03-14 11:52 被阅读0次

    来源 :

    https://kelvinh.github.io/blog/2014/04/19/research-on-operator-new-and-delete/

    new 与 delete代码意味着什么

    Class *pc = new Class;
    // ...
    delete pc;
    

    上面代码的第一行即为 new operator ,而第三行即为 delete operator ,代码很简单,但对编译器来说,它需要做额外的工作,将上述代码翻译为近似于下面的代码:

    void *p = operator new(sizeof(Class));
    // 对p指向的内存调用Class的构造函数,此处无法用直观的代码展现
    Class *pc = static_cast<Class*>(p);
    // ...
    pc->~Class();
    operator delete(pc);
    

    operator new 操作符到底做了什么,delete 操作符又做了什么?

    void * operator new(std::size_t size) throw(std::bad_alloc) {
        if (size == 0)
            size = 1;
        void* p;
        while ((p = ::malloc(size)) == 0) {
            std::new_handler nh = std::get_new_handler();
            if (nh)
                nh();
            else
                throw std::bad_alloc();
        }
        return p;
    }
    
    void operator delete(void* ptr) {
        if (ptr)
            ::free(ptr);
    }
    

    实际上是malloc的包装,但是至少分配一个字节,并且在内存失败时会尝试获取用户设置的new_handler,如果用户事先设置了new_handler,那么会调用new_handler,否则会执行异常抛出bad_alloc。

    placement new是什么

    inline _LIBCPP_INLINE_VISIBILITY void* operator new  (std::size_t, void* __p) _NOEXCEPT {return __p;}
    

    这个是operator new的一个重载。直接返回指针的值。感觉挺没有用的。那怎么使用呢?

    void *buf = // 在这里为buf分配内存
    Class *pc = new (buf) Class();
    

    上面是将buf的内存分给pc指针。其实就相当于:

    ((* Class)buf)->Class();
    Class *pc = buf;
    

    相关文章

      网友评论

          本文标题:c++ new 与 delete

          本文链接:https://www.haomeiwen.com/subject/omizfftx.html