1、new和delete表达式的工作机理
    
1)new表达式实际执行了三步
string *sp=new string("aaaa");
string *arr=new string[];//string采用默认初始化
     a、调用一个名为operator new(或者operator new[])的标准库函数,分配一块足够大的、原始的、未命名的内存空间,来准备存储对象或者对象的数组;
     b、编译器运行相应的构造函数构造这些对象,在这里运行的是string的构造函数;
     c、返回一个指向该对象或者对象数组的指针。
 
2)delete执行了两步操作:
delete sp;
delete []arr;
      a、对sp或者arr所指的数组中的元素执行相应的析构函数;
      b、编译器调用名为operator delete或者operator delete[]的标准库函数释放内存空间。
 
所以,想要控制内存分配,需要重载标准库函数中的operator new和operator delete函数,可以在类中重载,也可以在类外(全局)重载;使用作用域运算符::可以忽略类中的函数,直接执行全局作用域中的版本,::operator new,::operator delete。
 
2、标准库函数中的operator new 和operator delete
#ifndef _NEWANDDELETE_H_
#define _NEWANDDELETE_H_
#include<new>
#include<cstdlib>
using namespace std; class NewAndDelete {
public:
/**
* 以下是标准库函数中的operate new和operator delete
* 前面4个会抛出异常,后面4个不会抛出异常
* 这几个运算符函数是隐式静态的,因为operator new在构造对象之前,用来分配空间;operator delete在对象销毁之后,用来释放空间
* operator new 或者operator new[]的返回类型必须是void*,第一个形参类型必须是size_t并且没有默认实参,size_t代表要分配的空间的大小
* operator delete或者operator delete[]返回类型必须是void,第一个形参类型必须是void*,用指向待释放内存的指针来初始化
* 这两个函数的行为与allocator类中allocate()和deallocate()很类似
*/
static void *operator new(size_t);
static void *operator new[](size_t);
static void operator delete(void*)noexcept;
static void operator delete[](void*)noexcept; static void *operator new(size_t, nothrow_t&)noexcept;
static void *operator new(size_t, nothrow_t&)noexcept;
static void operator delete(void*, nothrow_t&)noexcept;
static void operator delete[](void*, nothrow_t&)noexcept;
}; //实现示例——使用malloc和free
void* NewAndDelete::operator new(size_t size) {
if (void *mem = malloc(size))
return mem;
else
throw bad_alloc();//抛出异常
}
void NewAndDelete::operator delete(void *mem)noexcept {
free(mem);
}
void* NewAndDelete::operator new(size_t size, nothrow_t& no)noexcept {//不抛出异常,返回空指针
void *p;
if (void *mem = malloc(size))
return mem;
else return p;
}
void NewAndDelete::operator delete(void *mem, nothrow_t& no)noexcept {
free(mem);
}
#endif

[C++] 重载new和delete——控制内存分配的更多相关文章

  1. C++之控制内存分配

    一.内存分配方式 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释 ...

  2. c++控制内存分配

    为了满足应用程序对内存分配的特殊需求,C++允许重载new运算符和delete运算符控制内存分配,通过定位new表达式初始化对象(好处是可以在某些场景下避免重新内存分配的消耗) 1.operate n ...

  3. 【C++ Primer | 19】控制内存分配

    重载new和delete 1. 测试代码: #include<iostream> #include<new> using namespace std; class A { pu ...

  4. 重载全局new/delete实现内存检测

    下面介绍用重载new/delete运算符的方式来实现一个简单的内存泄露检测工具,基本思想是重载全局new/delete运算符,被检测代码调用new和delete运算符时就会调用重载过的operator ...

  5. C++编程学习(八)new&delete动态内存分配

    前段时间楼主忙着期末大作业,停更了一段,今天刚好在做机器人课程的大作业时,和同组的小伙伴利用python做了工业机器人的在线编程,突然想起来很久没有阅读大型工程了,马上补上- 接下来的几篇博客主要是博 ...

  6. C++ 自学笔记 new和delete(动态内存分配)

    动态内存分配 Dynamic memoey allocation C++使用new和delete 来申请和释放内存 new:先申请一个空间 int\Stash : 默认构造函数初始化对象 ~:析构函数 ...

  7. C++ Primer 笔记——控制内存分配

    1.当我们使用一条new表达式时,实际执行了三步操作. new表达式调用一个名为operator new ( 或者operator new[] ) 的标准库函数.该函数分配一块足够大的,原始的,未命名 ...

  8. C++ 内存分配操作符new和delete详解

    重载new和delete 首先借用C++ Primer 5e的一个例子: string *sp = new string("a value"); ]; 这其实进行了以下三步操作: ...

  9. 【ThinkingInC++】64、重载new和delete,来模仿内存的分配

    /** * 书本:[ThinkingInC++] * 功能:重载new和delete.来模仿内存的分配 * 时间:2014年10月5日14:30:11 * 作者:cutter_point */ #in ...

随机推荐

  1. SpringBoot中快速实现邮箱发送

    前言 在许多企业级项目中,需要用到邮件发送的功能,如: 注册用户时需要邮箱发送验证 用户生日时发送邮件通知祝贺 发送邮件给用户等 创建工程导入依赖 <!-- 邮箱发送依赖 --> < ...

  2. slice splice(数组) 和 slice substr substring split (字符串)的区别

    array.slice(start,end)slice()如果不传入参数二,那么将从参数一的索引位置开始截取,一直到数组尾如果两个参数中的任何一个是负数,array.length会和它们相加 stri ...

  3. Liunx学习总结(六)--进程

    进程概述 简单来讲程序是一个包含可以执行代码的静态的文件.进程是一个开始执行但是还没有结束的程序的实例.当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作 ...

  4. JS之clientWidth、offsetWidth等属性介绍

    一.clientXXX 属性 代码演示 // css 部分 <style> .test{ width:100px; height:100px; border:1px solid red; ...

  5. 快速了解会话管理三剑客cookie、session和JWT

    更多内容,欢迎关注微信公众号:全菜工程师小辉.公众号回复关键词,领取免费学习资料. 存储位置 三者都是应用在web中对http无状态协议的补充,达到状态保持的目的 cookie:cookie中的信息是 ...

  6. Linux基础命令和文件权限

    Linux命令与文件权限 Linux基础命令   reboot  重启   cd         切换目录   cd ..     回到上一级目录   cd ~      回到主目录   cd /  ...

  7. Win10下安装python3.x+pycharm+autopep8

    一.安装Python3.X 1.Pythong官方网站:http://python.org/getit/   下载windows的安装包.有以下几个选项: 这里选择windows x86-64 exc ...

  8. 2018年全国多校算法寒假训练营练习比赛(第二场) B TaoTao要吃鸡 01背包变形题

    链接:https://www.nowcoder.com/acm/contest/74/B来源:牛客网 Taotao的电脑带不动绝地求生,所以taotao只能去玩pc版的荒野行动了, 和绝地求生一样,游 ...

  9. Heron and His Triangle 2017 沈阳区域赛

    A triangle is a Heron’s triangle if it satisfies that the side lengths of it are consecutive integer ...

  10. Windows下安装youtube-dl(下载各大网站视频)

    youtube-dl干什么用的? 惯例,看官方介绍: youtube-dl is a command-line program to download videos from YouTube.com ...