目录
二:operator new与operator delect函数
- 栈又叫堆栈--存储非静态局部变量/函数参数/返回值等,栈是向下增长的
- 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。
- 堆用于程序运行时动态内存分配,堆是可以向上增长的
- 数据段--存储全局数据和静态数据
- 代码段--可执行的代码。只读常量
一:new 和 delete
void test()
{
int* p1 = new int;
int* p2 = new int(1);
int* p3 = new int[5];
int* p4 = new int[5]{ 1,2,3 };
delete p1;
delete p2;
delete[] p3;
delete[] p4;
}
new 和 delete 都是操作符,并不是函数
第一个是直接申请一个int, 第二个是申请一个int 并且初始化为 5,第三个是申请 5 个int 的数组, 第四个是申请5个int的数组并且初始化
申请和释放连续的空间,需要使用new[],delete[]。
对于内置类型,new / delete与malloc / free 的作用完全相同,都是在堆上申请空间,只有用法的区别。但是对于自定义类型new和delect中的new可以自动调用构造函数去初始化类。delect会先调用析构函数,再去释放空间。
new失败不需要检查返回值,它失败抛出异常。
二:operator new与operator delect函数
new和delect是用户进行动态内存申请和释放的操作服,operator new和operator delect是系统提供的全局函数,new在底层调用operator new全局函数来申请空间, delect在底层通过operator delect全局函数来释放空间。
operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。operator delect最终是通过free来释放空间的。
三:malloc/free 和 new/delect的区别
malloc/free 和 new/delect的共同点是:都是从堆上申请空间,并且需要用户手动释放,不同的地方是:
- malloc和free是函数,new和delect是操作符
- malloc申请的空间不会初始化,new可以初始化
- malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可,如果是多个对象,[]中指定对象个数即可。
- malloc的返回值是void*,在使用时必须强转,new不需要,因为new后面跟的是空间的类型
- malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常
- 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delect在释放空间前会调用析构函数完成空间中资源的清理释放
模板
函数模板允许定义可以处理多种数据类型的函数:
template <typename T>
T max(T a, T b) {
return (a > b) ? a : b;
}
// 使用
int i = max(10, 5); // 调用 max<int>
double d = max(10.5, 20.3); // 调用 max<double>
类模板允许定义可以处理多种数据类型的类:
template <typename T>
class Stack {
private:
std::vector<T> elements;
public:
void push(T const& elem) {
elements.push_back(elem);
}
void pop() {
if (!elements.empty()) {
elements.pop_back();
}
}
T top() const {
if (!elements.empty()) {
return elements.back();
}
throw std::out_of_range("Stack<>::top(): empty stack");
}
};
// 使用
Stack<int> intStack; // int 类型的栈
Stack<std::string> strStack; // string 类型的栈