最近在学C++,在内存管理这里遇到几个点,记录一下加深记忆。ios
C++中有两种建立对象的方法,一种是直接声明,另外一种则是使用new
关键字,虽然做用相同,可是它们底层的存储方式却彻底不一样。在此以前,咱们先了解一下C++程序的存储形式。
C++程序的内存格局一般分为四个区:
1. data area(全局数据区)
2. code area (代码区)
3. stack area (栈区)
4. heap area (堆区)c++
其中,堆区就是“自由存储区”,咱们的new
就是在堆区中申请内存的。回归正题,C++的第一种类对象的建立方法,直接声明:程序员
#include <iostream>
using namespace std;
class Demo{
public:
Demo(char* str)
{
name = str;
cout << this->name << " come out" << endl;
}
private:
string name;
};
int main(){
Demo object1("object1");
}
复制代码
这种方法建立时,会在栈区开辟内存空间,这时内存管理由C++本身处理。可是,咱们的栈区是有限的,并且通常空间不大,因此new就派上用场了!
通常来讲,堆区的空间是足够大的,而在其中申请的内存空间,要由程序员本身管理。也就是说,当咱们new一个变量以后,若是以后不用了,就必须手动delete,不然,就会形成内存泄漏。数组
用new方法建立对象的方法以下:ui
int main(){
//Demo object1("object1");
Demo *object2 = new Demo("object2");
delete object2;
}
复制代码
C++中,建立对象数组很简单,方法以下:this
#include <iostream>
using namespace std;
class Demo{
public:
Demo(){
cout << "A Demo..." << endl;
}
Demo(char* str)
{
name = str;
cout << this->name << " come out" << endl;
}
private:
string name;
};
int main(){
Demo objs[10];
}
复制代码
可是,若是类没有默认构造方法,上面的方法就会报错,面对没有默认构造方法的类的对象数组的构造方法以下:spa
#include <iostream>
using namespace std;
class Demo{
public:
/* Demo(){ cout << "A Demo..." << endl; } */
Demo(char* str)
{
name = str;
cout << this->name << " come out" << endl;
}
private:
string name;
};
int main(){
// Demo objs[10]; // error;
Demo *objs = new Demo[10];
Demo **objs = new Demo *[10];
for (int i = 0; i < 10; i++)
{
objs[i] = new Demo("object");
}
}
复制代码