1.5 使用new创建动态结构和自动, 静态, 动态三种存储方式
1. 有些時候在運行時創建數組由于在編譯時創建數組(有些時候不是這樣, 比如使用OpenGL繪圖和GPU并行計算結合的時候, 需要將大量的數據傳送到顯存, 每次計算完又要傳送回宿主機渲染, 但并不是要傳送回所以值, 有些值可以仍然留在顯存中, 對于這些值, 顯然一次創建最恰當, 使用靜態數組最合適, 當然使用動態數組也可以, 但是只需創建一次就可以了), 對于結構體也是這樣.
2. C++中的結構體. 有兩種方式, 一種是動態方式, 一種是靜態方式. 使用new一般是動態方式, 一般是與指針搭配, 靜態方式是直接聲明的.
??? struct price{
???????? int apple;
???????? int orange;
???? };
???? 靜態方式, 是結構體類型數據, 類似于int類型數據的聲明方式, 如price p1={100,200};或者price p1; p1.apple=100; p1.orange=200; 靜態方式是結構體類型數據, 訪問結構體成員的時候采用句點操作符, 例如p1.apple, p1.orange.
???? 動態方式, 結構體指針類型數據, 采用箭頭操作符訪問結構體成員, 如price * p2=new price; p2->apple=100; p2->orange=200; 當然也可以通過這樣的方式采用句點操作符訪問結構體成員. 例如對于結構體指針price *p3=new price;(這里創建了一個結構體, 將結構體的首地址返回給等號右邊, 并賦給指向此結構體的指針p3, 不能直接寫成price *p3, 這樣只是創建了一個指針, 并沒有創建結構體), p3是指向結構體的指針, 那么使用解除引言操作符*可以得到結構體本身, 即*p3是結構體本身, 那么訪問成員的方式可以這樣(*p3).apple, (*p3).orange.
3. 使用new動態分配內存, 并釋放內存一遍重新使用. 下面的代碼使用了返回指針的函數.
#include <iostream>
#include <cstring>
using namespace std;char * getname() //返回指向輸入字符串的指針
{//子函數里面分配的內存temp是在棧里面,子函數結束調用后會自動釋放, 如果不讓他釋放,就要在子函數里使用malloc或者new, 子函數里分配的內存在子函數結束調用后才不會自動釋放掉,但是如果main函數結束后,所以得內存都會被釋放.char temp[80];//假設最多輸入80個cout<<"Enter name: ";cin>>temp;char *pn=new char[strlen(temp)+1];//分配合適的內存數,子函數調用后不會自動釋放strncpy(pn,temp,80);//拷貝temp指向的數據給pn指向的內存空間return pn; //返回指向包含輸入字符串的指針
}int main()
{char *name;name=getname();//name指向輸入字符串//從name開始打印字符,知道遇到空字符為止,并輸出字符串的首地址cout<<name<<" at "<<(int *)name<<endl;delete [] name; //釋放子函數getname里面分配的內存name=getname();//再次調用子函數cout<<name<<" at" <<(int *)name<<endl;delete [] name;return 0;
}
4. 三種存儲方式: 自動存儲, 靜態存儲, 動態存儲.
?? 自動存儲:?函數內部定義的常規變量使用自動存儲空間, 稱為自動變量(也稱局部變量), 如getname函數中的temp, pn. 他們在所屬的函數被調用時自動產生, 在該函數結束時消亡, 例如getname函數中的temp只在getname函數被調用時存在,?當調用結束時, temp使用的內存將被自動釋放, 如果getname返回temp的地址, 則main函數name指向的內存將很快被重新使用, 因此我們必須在getname中使用new并獲取一個副本.
?? 靜態存儲: 靜態存儲是在整個程序執行期間都存在的存儲方式, 在函數外聲明它或者使用關鍵字static.
?? 動態存儲: new和delete提供了比自動變量和靜態變量更靈活的方法. 他們管理一個內存池, 也成為自由存儲空間. 內存池通用語靜態變量和自動變量的內存是分開的. new和delete是程序員對程序如何使用內存有更大的控制權.
5. 堆棧, 堆和內存泄漏. 如果使用了new, 沒有調用delete, 即使包含指針的內存由于作用域規則和對象生命周期的原因而被釋放, 但是在自由存儲空間上動態分配的變量或者結構也將繼續存在, 但是將會無法訪問這些內存, 因為指向這些內存的指針無效了.這將導致內存泄漏. 被泄漏的內存將在程序的整個生命周期內斗不可使用, 這些內存被分配出去, 但無法收回, 可能導致可用內存耗盡, 程序崩潰. 我們要養成一種好習慣, 成對的使用new和delete, 在自由存儲空間上動態分配內存, 隨后便釋放它.
總結
以上是生活随笔為你收集整理的1.5 使用new创建动态结构和自动, 静态, 动态三种存储方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.4 指针
- 下一篇: 真正的编程高手-----激励计算机专业的