C++ 如何一次在堆上申請4G的內存?如何設計一個類只能在堆或者棧上創建對象?

1.如何一次在堆上申請4G的內存?

因爲32位的環境下虛擬地址空間的大小隻有4g,而光內核空間就需要1g,所以不可能申請得到,只有在64位的環境下纔可以實現,只需要把執行環境改爲64x即可

#include <iostream>
using namespace std;
int main()
{
	void* p = new char[0xfffffffful];
	cout << "new:" << p << endl;
	return 0;
}

2.設計一個類,該類只能在堆上創建對象

  • 將類的構造函數私有,拷貝構造聲明成私有。防止別人調用拷貝在棧上生成對象。
  • 提供一個靜態的成員函數,在該靜態成員函數中完成堆對象的創建

在堆和棧上創建對象都會調用構造函數,爲了防止在棧上創建對象我們將構造函數私有化。拷貝構造函數是在棧上創建對象。

class HeapOnly
{
public:
	static HeapOnly* Create()
	{
		return new HeapOnly;
	}
private:
	HeapOnly() {}
	HeapOnly(const HeapOnly&);

	//C++11形式
	HeapOnly(const HeapOnly&) = delete;
};

3.設計一個類,該類只能在棧上創建對象

  • 只能在棧上創建對象,即不能在堆上創建,因此只要將new的功能屏蔽掉即可,即屏蔽掉operator new和定位new表達式,注意:屏蔽了operator new,實際也將定位new屏蔽掉。

new和delete是用戶進行動態內存申請和釋放的操作符,operator new 和operator delete是系統提供的全局函數,new在底層調用operator new全局函數來申請空間,delete在底層通過operator delete全局函數來釋放空間。

operator new函數實際通過malloc來申請空間,當malloc申請空間成功時直接返回;申請空間失敗,嘗試 執行空間不足應對措施,如果改應對措施用戶設置了,則繼續申請,否則拋異常。

operator delete函數最終是通過free來釋放空間的

class StackOnly
{
public:
	StackOnly()  {};
private:
	void* operator new(size_t size);
	void operator delete(void* p);
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章