首先,作为一个程序员我们要学会如何管理内存,这里主要是堆内存,栈内存由系统管理,
在c中我们使用malloc和free,系统调用时使用sbrk函数
在c++中对于内存的管理,有两个运算符new和delete,先来给大家总结一下:
1、在C++中使用 new/delete 来管理内存,new用来申请内存,delete用来释放内存。
2、new在内存时允许对内存进行初始化。
3、使用new创建结构对象时会自动调用构造函数,delete时会自动调用析构函数。
总结:malloc/free与new/delete的区别?
1、malloc/free标准库的函数,使用时还需要添加头文件,而new/delete是C++语言中的运算符。
2、malloc返回值的是void*指针,new返回的是有类型的指针。
3、malloc创建对象时不会调用构造函数,free时不会调用析构函数,但new/delete会自动调用构造和析构函数。
4、使用malloc使用内存时需要自己计算字节数,而使用new的时候会自动计算。
4、[]可以配合new和delete申请或释放数组。
new[]与不可以与delete混用,必须使用delete[]释放。
使用new[]/delete[]创建多少个对象就会调用多次构造和析构。
5、new/delete与malloc/free不能混用。
6、delete不可以重复释放,但可以释放空指针。
7、如果使用new申请内存失败会抛出异常"std::bad_alloc"。
写一个类来在构造和析构函数中使用new和delete:
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
struct Student
{
char name[20];
char sex;
short age;
Student(void)
{
cout << "我是构造函数。。。" << endl;
}
Student(const char* _name,char _sex,char _age)
{
strcpy(name,_name);
sex = _sex;
age = _age;
cout << "我是构造函数。。。" << endl;
}
void show(void)
{
cout << name << " " << sex << " " << age << endl;
}
~Student(void)
{
cout << "我是析构函数。。。" << endl;
}
};
int main()
{
int* nump = NULL;
delete nump;
delete nump;
int* p = new int[10]{0,1,2,3,4,5,6,7,8,9};
for(int i=0; i<10; i++)
cout << *(p+i) << endl;
delete[] p;
Student* stu = new Student[10];
delete[] stu;
}
注意:
1、在new的同时可以为对象初始化
2、每次调用new创建对象时,会调用构造函数;
3、使用delete时,会调用析构函数。
4、申请多少次就要释放多少次,
也就是如果new[],那么在delete时也一定要加上[],即delete[].