C++new和delete的源码刨析
时间: 2024-05-11 21:18:27 浏览: 110
C++new和delete详细解析
C++中的`new`和`delete`是用于动态内存分配和释放的运算符。它们的底层实现是通过调用C++标准库中的`operator new`和`operator delete`函数来完成的。
`operator new`函数的原型如下:
```cpp
void* operator new(std::size_t size);
```
它接受一个参数`size`,表示要分配的内存大小,返回一个指向分配的内存块的指针。当内存不足时,`operator new`函数会抛出`std::bad_alloc`异常。
`operator new`函数的实现方式可以是调用操作系统提供的内存分配函数,也可以是通过维护一块大的内存池来实现。具体实现方式因编译器和操作系统而异。
`operator delete`函数的原型如下:
```cpp
void operator delete(void* ptr) noexcept;
```
它接受一个参数`ptr`,表示要释放的内存块的指针。`operator delete`函数不会抛出异常,因此需要使用`noexcept`关键字来声明。
`operator delete`函数的实现方式通常是调用操作系统提供的内存释放函数来实现。
在使用`new`和`delete`时,我们可以重载`operator new`和`operator delete`函数来自定义内存分配和释放的方式。例如,我们可以使用一个内存池来实现高效的内存分配和释放。
下面是一个简单的例子:
```cpp
#include <iostream>
#include <cstdlib>
void* operator new(std::size_t size){
std::cout << "Allocating " << size << " bytes" << std::endl;
void* p = std::malloc(size);
if(!p){
throw std::bad_alloc();
}
return p;
}
void operator delete(void* ptr) noexcept{
std::cout << "Deallocating memory" << std::endl;
std::free(ptr);
}
int main(){
int* p = new int;
delete p;
return 0;
}
```
输出结果为:
```
Allocating 4 bytes
Deallocating memory
```
可以看到,我们重载的`operator new`和`operator delete`函数成功地被调用了。
阅读全文