c++笔记--new和delete(一)

前面的话:我们都知道,当我们调用new来分配内存的时候,首先会分配内存,其次调用构造函数,最后返回指针。

对于第二步失败,我们后面也将介绍,第二步失败时会调用对应的delete来释放内存。本文主要探讨第一步失败的情况。

(一)内存分配失败的时候一般会怎么处理?

(1)c中,malloc如果失败会返回空指针

(2)早期的c++编译器,内存分配失败也是返回空指针

(3)可能由于加入异常机制,后来new失败的时候会抛出异常

(二)如何定制自己的内存分配不足时候的策略?set_new_handler

(1)什么是new_handler?

用以处理内存分配不足的函数叫做new_handler,它本质是个函数指针,可以通过set_new_handler来进行设置。

具体声明如下:

namespace std{

typedef void (*new_handler)();

new_handler set_new_handler(new_handler p) throw();

}

(2)new_hanlder可以做哪些工作?

1、删除其它无用的内存,使系统具有可以更多的内存可以使用,为下一步的内存申请作准备。

实现此策略的办法是:程序一开始执行就分配一大块内存,当new_handler被调用时,将它们释放还给程序使用。

2、设置另外一个new_handler。

如果当前的new_handler不能够做到更多的内存申请操作,或者它知道另外一个new_handler可以做到,

则可以调用set_new_handler函数设置另外一个new_handler,这样在operator new下一次调用的时候,

可以使用这个新的new_handler。

3、卸载new_handler,使operator new在下一次调用的时候,因为new_handler为空抛出内存申请异常。

4、new_handler抛出自定义的异常

5、不再返回,调用abort或者exit退出程序

(3)如何对自己的类定制new_handler?

对于自己的类定制new_handler,需要重载new,在重载new函数中调用set_new_handler来设置。

c++笔记--new和delete(一)

时间: 2024-12-21 03:36:26

c++笔记--new和delete(一)的相关文章

(笔记)Mysql命令delete from:删除记录

delete from命令用于删除表中的数据. delete from命令格式:delete from 表名 where 表达式 例如,删除表 MyClass中编号为1 的记录:    mysql> delete from MyClass where id=1; 请对比一下删除数据前后表的变化. FirstName LastName Age Peter Griffin 35 Glenn Quagmire 33 下面以PHP代码为例删除 "Persons" 表中所有 LastNam

LeetCode笔记:237. Delete Node in a Linked List

题目: Write a function to delete a node (except the tail) in a singly linked list, given only access to that node. Supposed the linked list is 1 -> 2 -> 3 -> 4 and you are given the third node with value 3, the linked list should become 1 -> 2 -

SQL大圣之路笔记——SQL TRUNCATE,DELETE,DROP

TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少. DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项.TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放. TRUNCATE,DELETE,DROP放在一起比较:TRUNCATE TABLE:删除内容.释放空间但不删除定义.D

MemcacheQ 的安装与使用

1.安装libevent 官网:http://www.libevent.org/ 全选复制放进笔记 $ wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz --no-check-certificate $ tar -zxvf libevent-2.0.21-stable.tar.gz $ cd libevent-2.0.21-stable $ ./configure --prefix=

MonkeyDevcie API 实践全记录

1.    背景 使用SDK自带的NotePad应用作为实践目标应用,目的是对MonkeyDevice拥有的成员方法做一个初步的了解. 以下是官方列出的方法的Overview. Return Type Methods Comment void broadcastIntent (string uri, string action, string data, string mimetype, iterable categories dictionary extras, component compo

Robotium中调用getActivity()方法导致程序挂起的研究浅析

1. 问题背景描述 在工作中需要在没有项目源码的情况下直接使用robotium测试目标android平台launcher,平台的版本基于当前最新的android 4.4.2.之前在验证可行性的时候使用本人同样使用android4.4.2的测试手机htc incredable s针对一个只有apk的notepad应用做过同样的验证,在测试手机上运行完全没有问题.该测试代码如下: package com.example.android.notepad.tryout; import com.robot

Robotium编写测试用例如何模拟Junit4的BeforeClass和AfterClass方法1 - 条件判断法

本文来源于:http://blog.csdn.net/zhubaitian/article/details/39293883 Robotium的测试类ActivityInstrumentationTestCase2是继承于Junit3的TestCase类,所以并没有提供Junit4的特性.如网上总结说的: 1.不能通过annotate的方式来识别子类的新特征,如不能实现@beforeclass,@afterclass等特征.只能通过写setup和teardown, 2.TestCase只能以te

[原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

C++ Primer 学习笔记_29_操作符重载与转换(4)--转换构造函数和类型转换运算符归纳、operator new 和 operator delete 实现一个简单内存泄漏跟踪器

C++ Primer 学习笔记_29_操作符重载与转换(4)--转换构造函数和类型转换运算符归纳.operator new 和 operator delete 实现一个简单内存泄漏跟踪器 一.转换构造函数 可以用单个实参来调用的构造函数定义从形参类型到该类型的一个隐式转换.如下: class Integral { public: Integral (int = 0); //转换构造函数 private: int real; }; Integral A = 1; //调用转换构造函数将1转换为In