一:概述:ios
(1):c++
1:在C++中,堆分配的概念獲得了擴展,不只C++的關鍵字new和delete能夠分配和釋放堆空間,並且經過new創建的對象要調用構造函數,
經過delete刪除對象也要調用析構函數。
(2):c++程序的內存分配機制:數據結構
(1):c++程序的內存格局分爲四個區, 1:全局數據區 2:代碼區 3:堆區 4:棧區 (2):今後能夠知道學習一門計算機語言,最基本的是數據結構的學習.
全局變量、靜態數據、常量及字面量存放在全局數據區,全部類成員函數和非成員函數代碼存放在代碼區,爲運行函數而分配的局部變量、函數參數、
返回數據、返回地址等存放在棧區,餘下的空間都被做爲堆區.
(3):malloc(),free(),和new ,delete的區別:函數
#include <iostream> #include "malloc.h" using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ class test { public: test(); //聲名test()函數; ~test(); //聲明test類的析構函數 void out_date(); protected: int day = 0; int year = 0; }; test::test() { cout<<"執行構造函數"<<endl; day = 27; year = 2020; } test::~test() { cout<<"執行析構函數"<<endl; } void test::out_date() { cout<<"the year is "<<this->year<<endl; cout<<"the day is "<<this->day<<endl; } int main(int argc, char** argv) { test *p; //p僅僅是一個類類型的指針; p = (test*)malloc(sizeof(test)); //沒有調用構造函數 free(p); //沒有調用析構函數 p->out_date(); //輸出的結構沒有通過構造函數. return 0; }
【注意day出現的現象:】
/*
malloc()僅僅只是一個函數調用,他沒有足夠的信息來調用一個構造函數,他所接受的參數是一個unsigned long類型,返回的數據類型是一個指針.
p從malloc()那兒得到的不過是一個含有隨機數據的類對象空間而已,對應的對象空間中的值不肯定。爲此,須在內存分配以後再進行初始化。
*/oop
#include <iostream> #include "malloc.h" /* 1:構造函數能夠有參數,因此跟在new後面的類類型也能夠跟參數 2:函數結束標記「}」,要麼遇到返回語句)自動調用析構函數。可是堆對象的做用域是整個程序生命期, 因此除非程序運行完畢,不然堆對象做用域不會到期. */ using namespace std; class test { public: test(); //聲名test()函數; test(int s);//構造函數重載, ~test(); //聲明test類的析構函數 void out_date(); protected: int day = 0; int year = 0; }; test::test(int s) { cout<<"帶參數的構造函數s=="<<s<<endl; //輸出3 } test::test() { cout<<"執行構造函數"<<endl; day = 27; year = 2020; } test::~test() { cout<<"執行析構函數"<<endl; } void test::out_date() { cout<<"the year is "<<this->year<<endl; cout<<"the day is "<<this->day<<endl; } int main(int argc, char** argv) { test *p; //p僅僅是一個類類型的指針; //new能夠根據參數來調用構造函數 p = new test(3); //分配堆空間,並執行構造函數 delete p; //手動調用析構函數 }
(4):拷貝構造函數:即用一個對象去構造另外一個構造函數,拷貝的意思:能夠理解成u盤從某硬件上拷貝來東西。學習