美文网首页
c++ 内存管理 new expression

c++ 内存管理 new expression

作者: JimmyPan | 来源:发表于2020-06-03 00:24 被阅读0次

基本元素
new
operator new
placement new
array new

一.new和operator new

1.new expression 的操作伪代码

complex * pc = new complex(1,2)

try{
void * mem = operator new(sizeof (complex)); // operator new可以被重载,没有重载的话,调用全局的::operator new
pc = static_cast<complex*>(mem);
pc->complex::complex(1,2); //直接调用 构造函数,部分编译器才可以做的操作
//或者调用 new(p) Complex(1,2) placement new
}
catch(std::bad_alloc){
}

2.operator new的全局版本 (vc版本)

operator new (size_t size,std::nothrow_t &) _THROW0{
void *P;
while((p = malloc(size) == 0){
  _TRY_BEGIN
if(callnewh(size) == 0 ) break; //callnweh由用户自己设定,可能可以释放一些觉得不重要的内存这样在下次malloc中可能可以成功
_CATCH(astd::bad_alloc)  return(0);
_CATCH_END
})
}
  • 第一个参数“必须”是size_t,以接受new expression的以sizeof(T)为实参的调用
  • callnewh(size) 由用户自己设定,可能可以释放一些觉得不重要的内存这样在下次malloc中可能可以成功
  • std::nothrow_t & 保证这个函数不抛出异常,指明这个函数通过返回一个空指针来表明分配失败,而不是抛出异常

3.delete expression

pc-> ~ Complex();
operator delete(pc);

4.array new

int * pi = new int[10] 的内存空间 (默认行为下的内存空间)
屏幕快照 2020-06-02 下午12.38.37.png
  • delete[] 会调用多次析构函数,如果对一个管理堆内存的对象来说会有影响。
  • delete 把指针指向的位置当成一个对象去解析,只会调用一次析构函数,所以并不会造成内存泄漏
  • 必须要有默认构造函数,array没机会给掉带参数的
  • new[]从地地址向高地址new, delete[] 从高地址向低地址delete
  • Debugger Header 在debug模式下出现
  • 头和尾有个cookie,记录整个分配空间的大小(malloc行为,每一次都会有)
  • 内存要16字节对齐,所以添加了 12个字节的填补

二.placement new

1.placement new

处理流程和new expression一样
区别在于对于operator new的调用上

string s;
string* s= new(&s) string("a");

调用void* operator new(size_t,void * start) { return start ;}

string s;
string* s= new(300) string("a");

调用void* operator new(size_t len,size_t extra) { malloc(len+extra) ;}

  • palcement new中调用operator new时,第一个参数是sizeof的值,之后再传递placement new接受的参数
1.placement delete的重载

placement delete的重载可以被自动调用。

每一个new操作都有分配内存,类型转换,调用构造三步操作
如果在调用构造时抛出异常,为了不让之前的分配出的内存泄漏,会自动调用与之对应的operator new的重载形式

operator new(size_size ,long) 会自动调用 void operator delete(void * ,long)
operator new(size_size ) 会自动调用 void operator delete(void *)

如果没有找到对应的重载, 则被视为放弃处理

相关文章

  • c++ 内存管理 new expression

    基本元素newoperator newplacement newarray new 一.new和operator ...

  • 关于 C++ 里的 New

    new expression : new 表达式 operator new : 操作符函数,用来分配内存. ...

  • 内存管理

    内存管理 C++使用new和delete两个运算符进行内存管理。 使用new进行动态分配和初始化对象 在自由空间内...

  • c++内存管理

    c++内存管理长文 c++内存管理

  • 内存管理

    内容包括: C++内存管理 Java内存管理 C++内存管理 内存分配方式 在C++中,内存分成5个区,分别是栈、...

  • C++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理C

    首先我们先了解一下内存: C语言使用malloc/free动态管理内存空间,C++引入了new/delete,ne...

  • C++内存

    认识C++内存 operator new, operator delete和new, delete operato...

  • iOS内存管理详解

    目录 block内存管理 autorelease内存管理 weak对象内存管理 NSString内存管理 new、...

  • GC基础

    1.什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 ...

  • 浅析内存

    之前在学c++的时候,只知道new是动态申请内存,需要手动释放,而直接 类 对象;的方式则是由编辑器管理内存,即在...

网友评论

      本文标题:c++ 内存管理 new expression

      本文链接:https://www.haomeiwen.com/subject/gxlyzhtx.html