C++内存分配new/delete

简介

在C语言中内存的分配与释放使用的函数是malloc与free。C++中有了类和对象,我们常用new和delete来新建和释放对象。至于new和delete的背后到底是什么,这篇文章做了个简单的记录。

new对象过程

假设我们定义了一个类Complex,下面的代码是新建一个Complex对象的过程代码。

1
Complex *pc = new Complex(1,2);

编译器会转为:

1
2
3
void *mem = operator new(sizeof(Complex));
pc = static_cast<Complex *>(mem);
pc->Complex::Complex(1,2); //调用构造函数,只有编译器才能这样做

上面代码中operator new叫操作符,其实是函数用来内存分配的,调用了malloc函数,源代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
void *operator new(size_t size, const std::nothrow_t &) _THROW0()
{
void *p;
while ((p = malloc(size)) == 0)
{
_TRY_BEGIN
if (_callnewh(size) == 0) break;
_CATCH(std::bad_alloc) return 0;
_CATCH_END
}
return (p);
}

上述代码中如果内存分配成功,指针p不为空会指向分配出的内存首地址,分配不成功,返回空指针执行循环体。

delete对象过程

释放掉pc所指对象的代码是delete pc。那么编译器会把这句代码转为:

1
2
pc->~Complex(); //先调用析构函数,说明内存的释放不是在析构函数中
operator delete(pc); //释放内存

operator delete实际的操作是调用free来释放内存

1
2
3
4
void __cdecl operator delete(void *p) _THROW0()
{
free(p);
}

总结

以上就是对C++内存分配释放中new/delete函数的说明,后面还会写文章对标准库allocator进行一定的分析。

声明

若有错误,欢迎讨论。严禁抄袭,仅用于学习。

坚持原创技术分享,您的money将鼓励我继续创作!