内存管理
在c语言中有malloc、realloc、free函数来进行动态内存上的管理,在cpp中产生了new,delete操作符来分配动态内存,为什么会出现new和delete呢,主要是因为cpp是面向对象的语言他需要更加规范的使用。接下来来分析new和malloc的区别
new、operator new和malloc之间的联系
首先来了解operator new 和malloc,malloc开辟空间失败返回的是0.而operator new开辟空间失败会抛出一个异常直接终止程序,但是他们两个的用法一模一样。而operator new 和new的联系是 new = operator new + 构造函数。
new 和 malloc 的区别
1、概念性质:new是操作符,malloc是函数
2、使用方式:malloc调用时使用字节数,而new是输入类型和开辟的个数,malloc返回的是void*需要强制类型转化,new返回的是对应的类型,
3、使用效果:malloc申请空间失败会返回0,new会返回一个异常。
内存泄露
什么是内存泄露?
内存泄漏是指p所指向的空间使用完以后,因为一些原因,没有释放空间,就会导致内存泄露
内存泄露有什么危害呢?对于长期运行的程序,比如后台服务,操作系统等,内存泄露会导致服务器响应越来越慢,最终卡死。
模板初阶
先见一见模板如何运用
// 泛型编程
//模板-》写与类型无关的代码
template<class T>//也可以用typename
//模板函数这个叫做
//在预处理阶段他会将函数实例化,然后程序再去调用实例化好的函数
void Swap(T& e1, T& e2)
{
T tmp = e1;
e1 = e2;
e2 = tmp;
}
这就是模板的运用,他会在预处理阶段就产生相应的函数,将函数模板实例化成为程序要用到的对应的函数,供程序调用。
模板可以分为函数模板和类模板。
类模板的运用需要将类的类型用尖括号括起来,再加想要创建的函数变量名。
typedef int STDatetype;
typedef struct Stack_c
{
STDatetype* _arr;
int _capacity;
int _size;
}Stack_c;
void StackInit(Stack_c* s) {}
void StackPush(Stack_c* s, STDatetype x) {}
void StackPop(Stack_c* s) {}
void StackDestory(Stack_c* s);
template <class T>
class Stack_CPP
{
public:
Stack_CPP(){}
~Stack_CPP() {}
void StackPush(T x) {}
private:
T* _arr;
int _capacity;
int _size;
};
int main()
{
//Stack_c st;
//StackInit(&st);
//StackPush(&st, 1);
//StackPop(&st);
//StackDestory(&st);在c中容易出现未初始化和销毁的问题,没有封装,不能同时定义两个不同类型的栈
Stack_CPP<int> st_int;
Stack_CPP<double> st_double;
st_double.StackPush(1);
st_int.StackPush(1);//c++中很多语法是为了解决c中解决不了的问题
return 0;
}