記憶體(new delete )

藍瘦_fun發表於2020-09-25

new

new 就是程式執行過程中申請空間的一種方式。你可以通過指標去訪問這個地址。

delete

delete:當你用完這個物件之後,把記憶體還給記憶體池的一種方式。

Dynamic Arrays(動態申請陣列)

int *p =new int ;
int *a=new int [10];
假設student 是個類
student *q =new student ();
student *r =new student[10]
在這裡插入圖片描述delete p;
a++ ;delete[] a;
delete q;
delete[] r;
delete用法小建議:
1.禁止用delete釋放不是new分配出來的空間
2.禁止用delete兩次釋放同一塊空間
3.如果new[],那麼delete[]
4.如果new,那麼delete;
5.如果你去delete一個null pointer(空指標) ,那麼他是安全的。例子中的 int *b。

舉個例子:程式碼如下。
a.h

#ifndef A_H
#define A_H


class A
{
public:
    A();
    ~A();
    void setI(int i);
    void f();
private:
    int num;
    int i;
    int *b;

};

#endif // A_H

a.cpp

#include "a.h"
#include <QDebug>

A::A()
{
    num=0 ;
    i=0;
    qDebug() << "進入建構函式" <<endl;
    b=0;  

}
A::~A(){
    if(b)delete b;  //最好加個if判斷
    qDebug() << "進入解構函式, num ="+ QString::number(num) <<endl;
}
void A::setI(int i)
{

    num=i;
    //假設 private : int i;
    //則 這句話變成 this->i =i;前面的i是私有變數i 後面的i是函式setI的引數,.
    //this->i=i;
    

}
void A::f()
{
    qDebug() << "HELLO"  <<endl;
    b=new int; //不管這個有沒有呼叫,沒呼叫就是一個空指標。我的建議第五點
}

main.cpp

#include "widget.h"
#include <QApplication>
#include <a.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;//可以不用管
    w.show();//可以不用管
    A *p=new A[10];
    for (int i=0;i<10;i++)
    {
        p[i].setI(i);
    }
    delete[] p;
    return a.exec();

}

程式執行結果如下 :
在這裡插入圖片描述如果主函式改成 delete p;
則只會顯示 “顯示解構函式,num =0;”說明有類陣列有沒被析構的。
***看完記得點個贊謝謝老闆。***
在這裡插入圖片描述

相關文章