日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 如何一次在堆上申请4G的内存?如何设计一个类只能在堆或者栈上创建对象?

發(fā)布時(shí)間:2024/4/11 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 如何一次在堆上申请4G的内存?如何设计一个类只能在堆或者栈上创建对象? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.如何一次在堆上申請4G的內(nèi)存?

因?yàn)?2位的環(huán)境下虛擬地址空間的大小只有4g,而光內(nèi)核空間就需要1g,所以不可能申請得到,只有在64位的環(huán)境下才可以實(shí)現(xiàn),只需要把執(zhí)行環(huán)境改為64x即可

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

2.設(shè)計(jì)一個(gè)類,該類只能在堆上創(chuàng)建對象

  • 將類的構(gòu)造函數(shù)私有,拷貝構(gòu)造聲明成私有。防止別人調(diào)用拷貝在棧上生成對象。
  • 提供一個(gè)靜態(tài)的成員函數(shù),在該靜態(tài)成員函數(shù)中完成堆對象的創(chuàng)建

在堆和棧上創(chuàng)建對象都會調(diào)用構(gòu)造函數(shù),為了防止在棧上創(chuàng)建對象我們將構(gòu)造函數(shù)私有化。拷貝構(gòu)造函數(shù)是在棧上創(chuàng)建對象。

class HeapOnly { public:static HeapOnly* Create(){return new HeapOnly;} private:HeapOnly() {}HeapOnly(const HeapOnly&);//C++11形式HeapOnly(const HeapOnly&) = delete; };

3.設(shè)計(jì)一個(gè)類,該類只能在棧上創(chuàng)建對象

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

new和delete是用戶進(jìn)行動態(tài)內(nèi)存申請和釋放的操作符,operator new 和operator delete是系統(tǒng)提供的全局函數(shù),new在底層調(diào)用operator new全局函數(shù)來申請空間,delete在底層通過operator delete全局函數(shù)來釋放空間。

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

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

class StackOnly { public:StackOnly() {}; private:void* operator new(size_t size);void operator delete(void* p); };

總結(jié)

以上是生活随笔為你收集整理的C++ 如何一次在堆上申请4G的内存?如何设计一个类只能在堆或者栈上创建对象?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。