博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【52】写了placement new也要写placement delete
阅读量:6905 次
发布时间:2019-06-27

本文共 1081 字,大约阅读时间需要 3 分钟。

1、Widget* pw = new Widget; 调用了两个方法:第一个方法是operator new 负责分配内存;第二个方法是在分配的内存上构造Widget,即调用Widget的default构造方法。

2、那么问题来了,如果operator new分配内存成功,而Widget构造抛出异常,这种情况下,pw还没有赋值,这不就导致资源泄露了?

  不会造成资源泄露,因为C++运行系统保证调用delete释放资源。

3、正常的operator new 如下:

  void* operator new(std::size_t) throw (std::bad_alloc);

  正常的operator delete如下:

  void operator delete (void* rawMemory) throw(); // global作用域中的正常签名式

  void operator delete (void* rawMemory,std::size_t size) throw (); //class 作用域中典型的签名式

  除了上面的operator new,还有重载operator new,这些重载的new称为placement new,其中有一个比较特殊的,如下:

  void* operator new (std::size_t, void* pMemory) throw ();

  当我们使用new在堆上申请内存时,编译器尝试找到一块内存。而上面的placement new是说,不要去找内存了,直接分配在pMemory上。

4、现在问题来了,存在多个重载的operator new,当我们调用一个重载的new,出现上面的情况,即构造Widget出现异常,运行时该调用哪个delete呢?

  做法是:调用一个与operator new 对应的operator delete,如果没有这样的delete,那么运行时系统什么也不做。这就必然导致资源泄漏。因此,为了避免这种情况下,用户必须保证operator new 存在与它对应的operator delete。

5、上面delete的调用,是说,使用operator new,构造对象时出现异常,运行期系统调用与之对应的operator delete。正常情况下,delete pw调用正常的delete。

6、为了避免漏掉相关的delete,可以建立一个父类,其它类继承,共享这些方法。需要注意的是,继承会导致掩盖同名称的成员,因此需要在子类中使用using XXX。

转载地址:http://kvldl.baihongyu.com/

你可能感兴趣的文章
java学习笔记-5 泛型
查看>>
Csharp windowform controls clear
查看>>
如何让ASP.NET默认的资源编程“.NET研究”方式支持非.ResX资源存储
查看>>
c#修改系统时间的方法
查看>>
R安装package报ERROR: a 'NAMESPACE' file is required
查看>>
关于main()函数的小技巧
查看>>
phpnow配置
查看>>
使用mailx发送邮件
查看>>
Webbrowser中模拟连接点击(非鼠标模拟)
查看>>
HDU 1049 Climbing Worm(水题)
查看>>
类 不包含 方法的定义
查看>>
Servlet与JSP有什么区别?
查看>>
OK335xS psplash Screen 移植
查看>>
drop.delete.trauncat的区别
查看>>
状态栏 隐藏问题
查看>>
IIS
查看>>
ul li css 做横向菜单
查看>>
Android深入浅出系列之Socket—Socket编程(二)
查看>>
[原创]对于运行ASP.NET程序时,提示:无法启动程序“http://localhost:3532/Default.aspx”。的解决办法...
查看>>
[转载]在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二)----使用方法...
查看>>