c++ new 与 delete

2018-03-14  本文已影响0人  linanwx

来源 :

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;
上一篇 下一篇

猜你喜欢

热点阅读