C++ 如何一次在堆上申请4G的内存?如何设计一个类只能在堆或者栈上创建对象?
生活随笔
收集整理的這篇文章主要介紹了
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.設計一個類,該類只能在堆上創建對象
- 將類的構造函數私有,拷貝構造聲明成私有。防止別人調用拷貝在棧上生成對象。
- 提供一個靜態的成員函數,在該靜態成員函數中完成堆對象的創建
在堆和棧上創建對象都會調用構造函數,為了防止在棧上創建對象我們將構造函數私有化??截悩嬙旌瘮凳窃跅I蟿摻▽ο?。
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); };總結
以上是生活随笔為你收集整理的C++ 如何一次在堆上申请4G的内存?如何设计一个类只能在堆或者栈上创建对象?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 动态内存管理:c/c++的动态内
- 下一篇: C++ 泛型编程(一):模板基础:函数模