C++ 中的new operator, operator new,placement new

new operator
 string *sp = new string("hello world");
 delete sp;

这里的new称之为 new operator(new 运算符),它做2件事:

  • 调用的是标准库函数operator new分配一块足够大的,未命名的内存空间。
  • 编译器运行相应的构造函数在刚才分配的内存上构造对象 , 并返回指向该对象的指针。

这里的delete它做2件事:

  • 调用该对象的析构函数
  • 调用标准库函数operator delete释放内存
operator new, operator delete函数
/* 这些版本可能抛出异常 new分配失败,抛出bad_alloc异常 */
void *operator new(size_t);    
void *operator new[](size_t);
void *operator delete(void*);
void *operator delete[](void*);

/* 下面版本承诺不抛出异常 new分配失败,不抛出异常,返回nullptr指针 */
void *operator new(size_t, nothrow_t &)  noexcept;    
void *operator new[](size_t, nothrow_t &)  noexcept;
void *operator delete(void*, othrow_t &)  noexcept;
void *operator delete[](void*, othrow_t &)  noexcept;

我们可以在全局或者类里面自定义上面的函数,当我们将其定义成类的成员函数时,它是隐式静态成员函数。

/* 编写operator new(分配内存) 和 operator delete(释放内存)简单实现方式 */
void* operator new(size_t size) 
{
    if (void *mem = malloc(size))
        return mem;
    else
        throw bad_alloc();
}

void* operator delete() noexcept
{
    free(mem);
}
placement new

上面的 operator new 只是分配内存,而 placement new 不分配内存,只负责在预先分配的内存上构造对象。

new (place_address) type;
new (place_address) type(initializers);
new (place_address) type[size];
new (place_address) type[size]{ braced initializers list };
  • 例子:
string *sp = static_cast(::operator new(sizeof(string)));  //operator new 分配内存
new (sp) string("hello world");  // placement new 构造对象
    
cout << *sp << endl;
    
sp->~string();    // 主动调用析构函数
::operator delete(sp);  //operator delete 释放内存
set_new_handler

set_new_handler 是一个"接受一个不接受参数也无返回值的函数"的函数指针,而这个函数就被用来处理bad_alloc异常。( void *operator new(size_t) 或者 void *operator new 分配内存失败 )。

  • 例子
#include      
#include       
#include 

void no_memory() 
{
    std::cout << "Failed to allocate memory!\n";
    std::exit (1);
}

int main() 
{
    std::set_new_handler(no_memory);
    std::cout << "Attempting to allocate 2 GiB..." << std::endl;
    char* p = new char [2 * 1024 * 1024 * 1024];
    std::cout << "ok\n";
    delete[] p;
    return 0;
}

你可能感兴趣的:(C++ 中的new operator, operator new,placement new)