定義乙個指標指向堆中的空間,指標所指向的空間是匿名的,只能通過該指標才能進行訪問。用new關鍵字申請的匿名空間,必須用delete關鍵字進行刪除。
一、在堆中建立記憶體
堆中用new建立的內存在程式結束時不會自動釋放,通過指標來訪問堆中的資料,程式結束時指標被自動釋放,所以導致堆中的記憶體空間無法使用,也無法找到。這就是記憶體洩漏;所以盡量使用delete手動釋放堆空間
#includeusing namespace std;
int main()
{ int *p;
p=new int;///堆,p指向建立的堆記憶體區域,大小與型別有關
*p=16;
cout<<"*p:"<<*p<
堆中指標只能通過delete釋放,並且這種釋放只是釋放了指標先前指向的那段記憶體空間,使得這段記憶體空間可以用來存放其他值。指標並沒有被刪除,這時的指標是乙個指向不確定的指標,使用指標之後要將其置0,表示為空指標,此時所指向的位址是0,該位址不能內容不可訪問。在棧中使用指標則不必考慮這個問題,因為棧中的指標會被系統自動釋放,只有用new時才使用delete。
在如下例子中,當指標p所指向的堆中記憶體被delete後,指標p儲存的記憶體位址並沒有改變,但是被釋放的那段記憶體被系統用來存放了其他值;新定義的指標p1恰巧指向指標p釋放的空間。但當改變指標p指向的值時,指標p1所指向的值也隨之改變。說明指標p還是能對先前釋放的記憶體進行操作。因此,在delelte一段記憶體之後,最好不要再使用它,或者將此指標賦值為0。
#includeusing namespace std;
int main()
{ int *p=new int;
*p=999;
delete p;
long *p1=new long;
*p1=99999;
*p=23;
delete p;
cout<<"p所指向的值改變之後,此時p1的值為:"<<*p1《二、在堆中建立物件
1.未使用delete釋放堆中物件
class a{
public:
a(){cout<<"建構函式執行中"<
2.使用delete釋放堆中物件
class a{
public:
a(){cout<<"建構函式執行中"<3.訪問堆中的資料:
堆採用匿名方式儲存資料,只有通過指標才可以訪問到資料,安全性高。
堆中的空間不會自動釋放,只有通過程式設計師來釋放,屬於動態記憶體;
堆與棧不同,棧是系統自動分配記憶體,堆需要程式設計師通過new關鍵字來分配記憶體,
棧是一段連續的記憶體空間,它的大小最多2m,而堆的記憶體空間不連續,由鍊錶鏈結起來
class a{
public:
a(){cout<<"建構函式執行中"<4.在建構函式中開闢堆空間:在類的資料成員中,定義了乙個指標型別的資料成員,並在建構函式中為指標成員申請堆中的空間。在程式結束時,系統自動呼叫析構函式析構物件,但是物件的資料成員在堆中的空間並未被釋放,所以要在析構函式中加上delete i,這樣才能在析構物件的時候釋放指標i指向的堆中空間。
class a{
public:
a(){cout<<"建構函式執行中"<
前面說過,在堆中刪除乙個指標後,一定要將該指標設定為空指標,這是因為刪除該指標只會釋放它所指向的記憶體空間,不會刪除指標,因此這個指標還存在,並且仍然指向原來的空間。這時如果再次嘗試使用該指標,就會出現錯誤。
在下例中,雖然指標p的物件被釋放,但是p中儲存的位址不變,使用p還是能改變該位址中物件的資料成員。
#includeusing namespace std;
class a
{public:
a(){i=100;cout<<"建構函式執行中..."<
#include int main()
{ int *p = new int;
*p = 1;
std::cout<<"p's adress is "<
演算法 之 堆 建立堆
給出乙個有n個元素的陣列a 1.n 要建立乙個包含這些元素的堆,可以這樣進行 從空的堆開始,不斷插入每乙個元素,直到a完全被轉移到堆中為止。因為插入第j個鍵值用時o log j 因此用這種方法建立堆疊的時間複雜性是o n log n 我們知道對應於堆h 1.n 的樹的節點可以方便地以自頂向下 從左到...
堆 初步學習堆的簡單使用
堆的使用 今天學習了乙個演算法,堆 用法之一 堆一般用陣列的形式儲存數字,通過維護乙個完全二叉樹的結構來儲存前幾大的數字 先確定乙個需要維護的數字的多少,然後建立乙個陣列,陣列的第一樹根是arr 然後每個arr i 樹根的左兒子是arr 2i 右兒子 是arr 2i 1 十分具有規律,所以一般就用陣...
堆區的使用
define crt secure no warnings include include includeint getspace for int i 0 i 5 i return p void test01 手動在堆區建立的資料,要手動釋放 free p p null 注意 如果主調函式中沒有給指...