釋放佇列元素包含的指標指向的區域問題

2021-08-15 07:44:49 字數 682 閱讀 8259

先看程式:

#include #include #include #include using namespace std;

bool destruct = true;

struct img

~img()

sleep(1000);

}};int test()

int main()

備註:這個問題是在某個專案裡遇到的。工程一建立了佇列並push元素,然後將指向該佇列的指標傳給工程二。工程二里使用完後pop該佇列。這時,pop操作時不執行佇列元素的析構函式。所以,需要將pop操作封裝,再將封裝後的函式交給工程二呼叫,此時,正常執行pop操作,即析構被執行。

在結構img裡,有乙個指標img指向一塊記憶體區。一般情況下正常執行push和pop是可以的。當重複執行push和pop次數達到上萬或上百萬時,記憶體會溢位。因為佇列pop後,被拋棄的頭元素和它指向的記憶體成了「野區」,沒有被指,也無法被用,直到程式結束被徹底釋放。記憶體空間有限,所以資料量特別大時,需要不停的釋放。於是在析構裡加入delete。在程式執行結束,析構會被再次呼叫,所以加入乙個開關控制,防止被二次delete。

在析構函式中打斷點,可以看到斷點處跑了四次。分別是兩次pop各執行一次,test函式執行結束執行兩次。

建議:模擬指標,跨工程delete也可以執行,但不鼓勵這樣做。

指向陣列元素的指標

乙個變數有位址,乙個陣列包含若干元素,每個陣列元素都在記憶體中占用儲存單元,它們都有相應的位址 指標變數既然可以指向變數,當然也可以指向陣列元素 把某一元素的位址放到乙個指標變數中 所謂陣列元素的指標就是陣列元素的位址 定義乙個指向陣列元素的指標變數的方法,與以前介紹的指向變數的指標變數相同 例如 ...

C指標 指向陣列的指標和指向陣列內部元素的指標

int p 5 arr 這裡的 也可以不寫,因為陣列名本身就表示陣列的首位址 int p arr int p arr int p arr 0 上面三種宣告方式都是合法且等價的 int a 5 int p a 指向陣列元素的指標,用來訪問陣列內部的元素,單位長度是sizeof int int q 5 ...

c語言之指標(指向陣列元素的指標與指向陣列的指標)

指向陣列元素的指標 include define m 3 main int s m i,j void max int p1,int p2 printf matrix a n for i 0 ifor j 0 j printf 4d a i j printf n max s,a 0 必須為實參必須a ...