例如找出令人信服的權威C++中間malloc與new

weixin_34120274發表於2015-07-24

例如找出令人信服的權威C++中間malloc與new  

問題:   

非常多人都知道malloc與new都是用來申請空間用的,開闢空間來源於堆中。

可是在C++中卻非常少用malloc去申請空間,為什麼?


以下小編會以一個非常有說服力的樣例來說明。相信大家一看就能明確。


C++程式的格局可分為4個區,注意是“格局”,

1、全域性資料區     //當中全域性變數,靜態變數是屬於全域性資料區

2、程式碼區     //全部的類和非成員函式的程式碼都存放在程式碼區

3、棧區    //為成員函式執行而分配的區域性變數的空間都在棧區

4、堆區 //剩下的那些空間都屬於堆區

當中全域性變數,靜態變數是屬於全域性資料區。全部的類和非成員函式的程式碼都存放在程式碼區。為成員函式執行而分配的區域性變數的空間都在棧區。剩下的那些空間都屬於堆區。


以下來寫個簡單的樣例:malloc.cpp

#include <iostream>
using namespace std;
#include <stdlib.h>

class Test{
    public:
        Test(){
            cout<<"The Class have Constructed"<<endl;
        }   
        ~Test(){
            cout<<"The Class have DisConstructed"<<endl;
        }   
};

int main(){
    Test *p = (Test*)malloc(sizeof(Test));
    free(p);
    //delete p;
    return 0;
}

編譯執行:The Class have DisConstructed

結果是沒有呼叫建構函式。從這個樣例能夠看出,呼叫malloc後,malloc僅僅負責給物件指標分配空間。而不去呼叫建構函式對其初始化。而C++中一個類的物件構造,須要是分配空間。呼叫建構函式。成員的初始化,或者說物件的一個初始化過程。通過上述樣例希望大家在使用C++中儘量不要去使用malloc。而去使用new。

<span style="font-size:14px;">#include <iostream>
using namespace std;
#include <stdlib.h>

class Test{
    public:
        Test(){
            cout<<"The Class have Constructed"<<endl;
        }   
        ~Test(){
            cout<<"The Class have DisConstructed"<<endl;
        }   
};

int main(){
  //Test *p = (Test*)malloc(sizeof(Test));
    Test *p = new Test;
    cout<<"test"<<endl;
    
    //free(p);
    delete p;

    return 0;
}</span>


執行結果例如以下:

The Class have Constructed

 The Class have DisConstructed

假設想更加系統瞭解C++ new/delete,malloc/free的異同點,能夠參看“深入C++ new/delete,malloc/free解析”瞭解詳情。


版權宣告:本文部落格原創文章。部落格,未經同意,不得轉載。

相關文章