堆:
全局数据区 | ![]() |
代码区 | ![]() ![]() |
堆区 | ![]() |
栈区 | ![]() |
在C++中,从堆中分配和存储内存空间使用操作符new 和delete。在内存中开辟空间后,必须在使用完毕后释放内存空间,否则造成内存泄漏。
为什么使用new和delete?
在C语言中,使用malloc函数来开辟空间,使用free()函数释放,但在class使用过程中,会无法调用析构函数。看下面代码:
//---main.cpp---
#include<iostream>
#include<malloc.h>
#include"student.h"
using namespace std;
int main()
{
Student *p;
p=(Student*)malloc(sizeof(Student));
p->print();
free(p);
return 0;
}
//---student.h---
#include<iostream>
using namespace std;
class Student{
protected:
string name;
int year;
float gpa;
public:
Student(){
name="your_name";
year=19;
gpa=5.0;
}
void init(string,int,float);
void print();
~Student(){
cout<<"------end-----"<<endl;
};
};
void Student::init(string name,int year,float gpa){
this->name=name;
this->year=year;
this->gpa=gpa;
}
void Student::print(){
cout<<"name->"<<name<<",year->"<<year<<",gpa->"<<gpa<<endl;
}
在main.cpp中,创建了一个指向Student类的指针,然后使用malloc函数为其开辟空间,使用free函数释放空间。
注意:上面的代码无法执行,
同时,使用malloc函数也不会调用析构函数!
所以,在C++·中,使用new为class类型开辟空间。
#include<iostream>
#include<malloc.h>
#include"student.h"
using namespace std;
int main()
{
Student *p;
p= new Student;
p->print();
delete p;
return 0;
}
执行结果为
name->your_name,year->19,gpa->5
------end-----
从堆中分配对象数组: