c++动态内存管理题目
malloc/free和new/delete的區別
malloc/free和new/delete的共同點是:都是從堆上申請空間,并且需要用戶手動釋放。不同的地方是:
請設計一個類,該類只能在堆上創建對象
- 將類的構造函數私有,拷貝構造聲明成私有。防止別人調用拷貝在棧上生成對象。
- 提供一個靜態的成員函數,在該靜態成員函數中完成堆對象的創建
請設計一個類,該類不能在棧上創建對象
class StackOnly { public: static StackOnly CreateObject() { return StackOnly(); } private: StackOnly() {} };只能在棧上創建對象,即不能在堆上創建
因此只要將new的功能屏蔽掉即可,即屏蔽掉operator new和定 位new表達式,注意:屏蔽了operator new,實際也將定位new屏蔽掉。
class StackOnly { public: StackOnly() {} private: void* operator new(size_t size); void operator delete(void* p); };檢測下面程序運行結果
class Test { public:~Test(){delete this;}};int main() {Test* pt = new Test;delete pt;return 0; }答:無限遞歸,每回在釋放對象時delete this,this又是對象,又要調用析構,所以無限遞歸。
如何一次在堆上申請4G的內存?
在探討這個問題之前,我們需要認識到機器的內存分布。
因為Windows下的機器內存分布模型我們不清楚。所以我們在這里討論的是Linux下的4G內存空間的申請。
假如我們現在的Linux一共有4G的內存空間。那么它有1G是供操作系統內核使用的。也就是說我們程序最多只能申請到3G的空間,事實上,我們最大申請到的空間也就2G左右。
#include<iostream> using namespace std; int main() {void* p = new char[0xfffffffful];cout << "new:" << p << endl;return 0;}上述代碼按64位編譯就可以申請了
不要疑問4G*4G空間,我們知道虛擬地址空間和物理地址空間之間有一種映射關系,我們能申請到并不意味著物理地址真的有這么大。你想,我們申請到的4G空間并不是說需要一下子需要這么大,只是說可以滿足我們4G的需求就可以了,所以當你用到的地方才會真的申請空間,一旦哪一部分釋放空間了,就會把前邊釋放的空間再拿過來用(讀者可以想象這個過程)。
內存泄露
什么是內存泄露
內存泄漏指因為疏忽或錯誤造成程序未能釋放已經不再使用的內存的情況。內存泄漏并不是指內存在物理上 的消失,而是應用程序分配某段內存后,因為設計錯誤,失去了對該段內存的控制,因而造成了內存的浪 費。
內存泄露分類
- 堆內存泄露
堆內存指的是程序執行中依據須要分配通過malloc / calloc / realloc / new等從堆中分配的一塊內存, 用完后必須通過調用相應的 free或者delete 刪掉。假設程序的設計錯誤導致這部分內存沒有被釋放,那 么以后這部分空間將無法再被使用,就會產生Heap Leak - 系統資源泄漏
指程序使用系統分配的資源,比方套接字、文件描述符、管道等沒有使用對應的函數釋放掉,導致系統 資源的浪費,嚴重可導致系統效能減少,系統執行不穩定。
如何解決
如何避免
總結
以上是生活随笔為你收集整理的c++动态内存管理题目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑网1归来五行激活有什么用
- 下一篇: 麻烦发个85红眼纯刷图加点,详细点,谢谢