最近在學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");
}
}
複製代碼