动态内存管理

本文将针对C++中动态内存管理的方式进行总结

首先说明一点,动态内存管理在堆上进行,其生存周期为分配内存至手动释放内存的时间段,我们应当尽量避免手动进行内存管理。

C++动态内存管理的方式

new and delete

new/delete的基本用法
1
2
3
4
5
6
7
int size = 5;
int *a = new int[size];
delete []a;

class A {...} //声明一个类 A
A *obj = new A(); //使用 new 创建对象
delete obj;
new /delete底层实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 全局 operator new
void * operator new(std::size_t size) throw(std::bad_alloc) {
if (size == 0)
size = 1;
void* p;
while ((p = ::malloc(size)) == 0) { //采用 malloc 分配空间
std::new_handler nh = std::get_new_handler(); //std::new_handler 是函数指针类型(指向不接收参数并返回 void 的指针)
if (nh)
nh();
else
throw std::bad_alloc(); //分配失败,抛出异常
}
return p;
}
// 对应的全局 operator delete 采用 free 释放空间
void operator delete(void* ptr) {
if (ptr)
::free(ptr); //采用 free 释放空间。
}

malloc and free

传统的C语言式内存管理,不建议在C++中使用,使用方式如下:

1
2
3
char *str;
str = (char *) malloc(15);
strcpy(str, "tutorialspoint");

两者比较

在C++中,如果不是必须,那么尽可能使用new和delete,因为new、delete可以确保对象的构造函数和析构函数被调用,是类型安全的。

参考文献

0%