c++中的内存空间不足和自定义处理内存不足

new操作符动态分配内存时,首先它会调用对象的operator new()函数分配相应大的内存(如果对象类没有重载operator new()函数,则默认调用<new>头文件里的operator new()函数分配内存);接着调用对象的构造函数,初始化这块内存;最后返回指向该内存块的指针。

当分配内存时,如果内存空间不够用,则分配函数会默认抛出bad_allco类型异常,供用户接收并处理。另外,我们还能自己定义如何处理空间不足,用一个函数指明该如何处理内存不足。下面这个例子中,必然会导致内存不足,我用set_new_handler()指定一个自定义函数去处理内存不足问题,之后,分配内存不足时,不会默认抛出bad_allco()异常,而是去执行我定义的函数,我定义的函数在输出信息后又抛出了异常(当然这个函数你可以随便写)。

#include <iostream>
//#include <new>
using namespace std;

void out_of_store()
{
    cerr << "my bad_alloc\n";
    throw bad_alloc();
}

int main()
{
    set_new_handler(out_of_store);
    try {
        for (;;)
            new char[10000];
    }
    catch (bad_alloc) {
        cerr << "Memory exhausted! \n";
    }
    system("PAUSE");
    return 0;
}

时间: 2024-10-11 06:35:28

c++中的内存空间不足和自定义处理内存不足的相关文章

C++中用new开辟内存空间和非new开辟内存空间的区别

#include <iostream> using namespace std; class A { private: int n; public: A(int m):n(m) { } ~A(){} }; int main() { A a(1); //栈中分配 A b = A(1); //栈中分配 A* c = new A(1); //堆中分配 delete c; return 0; } 复制代码 第一种和第二种没什么区别,一个隐式调用,一个显式调用,两者都是在进程虚拟地址空间中的栈中分配内存

Linux内存点滴:用户进程内存空间

原文出处:PerfGeeks 经常使用top命令了解进程信息,其中包括内存方面的信息.命令top帮助文档是这么解释各个字段的.VIRT , Virtual Image (kb)RES, Resident size (kb)SHR, Shared Mem size (kb)%MEM, Memory usage(kb)SWAP, Swapped size (kb)CODE, Code size (kb)DATA, Data+Stack size (kb)nFLT, Page Fault countn

前端基础进阶(一):内存空间详细图解

变量对象与堆内存 var a = 20; var b = 'abc'; var c = true; var d = { m: 20 } 因为JavaScript具有自动垃圾回收机制,所以对于前端开发来说,内存空间并不是一个经常被提及的概念,很容易被大家忽视.特别是很多不是计算机专业的朋友在进入到前端之后,会对内存空间的认知比较模糊,甚至有些人干脆就是一无所知. 当然也包括我自己.在很长一段时间里认为内存空间的概念在JS的学习中并不是那么重要.可是后我当我回过头来重新整理JS基础时,发现由于对它们

C++中怎么求类的大小?以及内存对齐原理(面试官经常问到的问题)

<pre name="code" class="cpp">#include<iostream> using namespace std; int main(){ class S{}; cout<<sizeof(S); return 0; } 程序居然输出为1!到底是怎么回事?首先我在这里要声明一点--类在未初始化之前确实不会分配空间,这里探讨的是sizeof(类)的问题,详细情况看下面的例子 C++中的类所占内存空间总结 类所占内

【转】内存分配粒度vs内存分页大小vs内存空间

原帖地址 分配粒度:表示每次请求内存的时候最小给分配多少,比如32位操作系统基本上每次分配的是64K大小. 分页大小:表示的是页面的大小,32位操作系统是4K是内存管理的最小单位. 例如: 假设你要请求6k = 4K + 2K的空间,操作系统会一次分配64K的空间放着,又因为内存最小操作单位是4K,所以实际上给你分配了8K=4K + 4K,剩下的56K放着有需要了再给你. WIN32 操作系统为每个进程分配4G的内存空间,程序的代码,常量变量都分配在这4G内存空间上. 这里提到的内存空间跟内存条

C++中的类所占内存空间总结

C++中的类所占内存空间总结 最近在复习c++的一些基础,感觉这篇文章很不错,转载来,大家看看! 类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算在内的. 摘抄部分: 成员函数还是以一般的函数一样的存在.a.fun()是通过fun(a.this)来调用的.所谓成员函数只是在名义上是类里的.其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码.而我们访问类的成员函数是通过类里面的一个指针实现,而这个指针指向的是一个table,table

C/C++ 错误笔记-在给结构体中的指针赋值时,要注意该指针是否已指向内存空间

先来看下面的例子: #include <stdlib.h> #include <string.h> #include <stdio.h> #pragma warning(disable:4996) typedef struct _Student { char name[64]; int age; }Student; typedef struct _Teacher { char name[64]; int age; char *p1; char **p2; Student

ZigBee中内存管理(一个内存空间引发的血案)

这个Zigbee的项目好久没有写了,现在对这个项目有点陌生,好多东西都搞不懂了.今天写一个简单的无线发送小程序时,一直出问题,程序调用zstack中的AF_DataRequest函数,如下 AF_DataRequest( &Coor_Addr, &App_epDesc,                        APP_CLUSTERID_ADC,                        sizeof(ADC_Value),                        (uin

C++学习笔记(十五):vector对象在内存空间中是如何增长的

vector对象在内存空间中是如何增长的   我们都知道vector对象是动态存储的,从这一点看有点像链表,可以动态的增加或减少元素.我们也知道链表中是有指针变量,专门用于存储上一个和下一个元素的地址.正是因为这两个指针的存在,我们才能做到动态的存储数据,即不用像数组那样必须事先申请好空间.链表的缺点就是不能够快速的随机访问其中元素,必须通过指针层层查找. 但是,vector既可以实现动态存储数据,而且支持快速随机访问(用下标或者指针访问元素).对于能够用下标查找的数据类型,其存储方式必定是连续