美文网首页
Effective c++学习笔记(item50)

Effective c++学习笔记(item50)

作者: 懒生活 | 来源:发表于2022-10-20 09:44 被阅读0次

# 什么时候要重写new

这里要注意编译器是如何解释new这个关键字的,只有理解了才能知道怎么重写new。当编译器看到`t* = new t();` 的时候,编译器做了如下几个动作

+ 调用 `new(sizeof(t))`来分配内存

+调用t的构造函数,实例化的数据会填充在分配的内存上。然后返回指向这个实例化的指针。

+如果中间发生异常,会调用相应的delete,释放掉内存。

所以虽然只是简单的new, 编译器看到后转换的代码不少。

这里如果我们要干预这个过程,可以通过重载new(sizeof(t))和对应的delete来干预。只要重载`void* operator new(std::size_t size) throw(std::bad_alloc)`就可以达到干预的目的。

# 一个重载new的实例

```

void* operator new(std::size_t size) throw(std::bad_alloc) // new的原型

{

size_t realSize = size+2*sizeof(int);

void *pMem = malloc(realSize);

if(!pMem) throw bad_alloc();

*(static_cast<int*>(pMem)) = signature;

*(reinterpret_cast<int*>(staic_cast<Byte*>(pMeme)+realSize-sizeof(int))) = signature;

return static_cast<unsigned char*>(pMem)+sizeof(int);

}

```

这样实现的new重载,有两个问题,问题1是没有按惯例设计new,问题2是没有办法保证字节对齐。

所以重载一个完备的new是要注意很多方面的,非必要不要自己重载。

如果要重载,要考虑item51的说明

相关文章

网友评论

      本文标题:Effective c++学习笔记(item50)

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