来源 :
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;
网友评论