關於new delete和堆的一些理解

2022-03-25 18:27:58 字數 816 閱讀 8339

第一://////////visula c++ 6.0環境

#include

void main()

第二://////////visual c++ 6.0環境

#include

void main()

{int a=3;

int *p=new

int;

*p=a;

cout<<*p《其中第乙個程式存在錯誤(會生成.exe檔案,但是執行有錯誤)

問題出在對new和delete、堆不是很了解。

而第二個程式是正確的。

現在我來分析一下:

int *p=new int;

是在heap分配乙個int型的空間,而p是在stack裡的乙個指標,它指向heap裡的那個int,

在程式結束的時候,p指標將釋放掉,所以要在程式結束的時候delete p,這是為了釋放在

heap裡分配的那個int,否者會造成heap區空間的洩漏,這是很嚴重的。

第乙個程式中的:

p=&a;

它把a的位址賦給p,這時p指的是a,而不是heap裡的那個int了,後來

delete p;

這是想刪除p指向的內容,但是此時p指向的stack裡的a了,而delete是不能用

於stack的資料的,所以出現了錯誤。

第二個程式中的:

*p=a;

這只是將a的值賦給p指向的那個int,此時p還是指向heap裡的int,

所以這裡的

delete p;

是合法的了,不會出現錯誤。 

本文**

關於new delete和堆的一些理解

關於new delete和堆的一些理解先看以下的兩個簡單的程式 第一 visula c 6.0環境 include void main 其中第乙個程式存在錯誤 會生成.exe檔案,但是執行有錯誤 問題出在對new和delete 堆不是很了解。而第二個程式是正確的。現在我來分析一下 int p new...

關於new delete和堆的一些理解

關於new delete和堆的一些理解 先看以下的兩個簡單的程式 第一 visula c 6.0環境 include void main 其中第乙個程式存在錯誤 會生成.exe檔案,但是執行有錯誤 問題出在對new和delete 堆不是很了解。而第二個程式是正確的。現在我來分析一下 int p ne...

學習筆記 new delete的堆記憶體操作

c c 中的動態記憶體分配是指程式設計師手動執行記憶體分配。動態分配的內存在堆上分配,非靜態和區域性變數在堆疊上分配記憶體 有什麼應用?他與分配給普通變數的記憶體有什麼不同?如何在c 中分配 取消分配記憶體?普通陣列宣告與使用new 宣告普通陣列與使用new分配記憶體塊之間有區別。最重要的區別是,常...