`
pleasetojava
  • 浏览: 703679 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

关于C++对象的自杀

 
阅读更多

关于C++对象的自杀


Jason Lee @ csdn

2010-11-05


前两天看到一个问题,一个类的成员函数是否可以delete this
据出题者的意思来看,是认为这样的问题一般比较少人会遇到,而这样就可以了解一下对方对未知问题的分析和解决思路。

出于这点,我也想看看自己的思路,所以就先自己思考了一下。
1. 要使用delete,那么对象需要使用new来实例化(处于堆中),而不能使用类似DemoCls d;这样的语句将对象放在栈中;
2. 成员函数delete this,这样给了我一种感觉:这个成员函数是不是超出了自己的权限呢?然而进一步想,我认为delete this纯粹代表释放this指针指向的特定大小的内存空间,告诉内存管理单元这块内存区域又“自由”了;
基于以上两点,我认为由new运算符分配空间得到的对象的成员函数可以调用delete this;语句。

后面在C++ FAQ看到该问题的阐述,原文如下:


[16.15] Is it legal (and moral) for a member function to say delete this?

As long as you're careful, it's OK for an object to commit suicide (delete this).

Here's how I define "careful":

1. You must be absolutely 100% positive sure that this object was allocated via new (not by new[], nor by placement new, nor a local object on the stack, nor a global, nor a member of another object; but by plain ordinary new).
2. You must be absolutely 100% positive sure that your member function will be the last member function invoked on this object.
3. You must be absolutely 100% positive sure that the rest of your member function (after the delete this line) doesn't touch any piece of this object (including calling any other member functions or touching any data members).
4. You must be absolutely 100% positive sure that no one even touches the this pointer itself after the delete this line. In other words, you must not examine it, compare it with another pointer, compare it with NULL, print it, cast it, do anything with it.

Naturally the usual caveats apply in cases where your this pointer is a pointer to a base class when you don't have a virtual destructor.


上面提到了“自杀”时需要注意4点:
1. 对象是通过最简单的new运算符分配到空间的,而非new[],也不是内存定位的new(比如new(P) Q),更不是栈上面的、全局的,最后该对象不能是另外一个对象的成员;
2. 负责自杀的成员函数应该是该对象最后调用的成员函数;
3. 负责自杀的成员函数在delete this;这一条语句后面不能再去访问对象的其它成员;
4. 对象自杀后,不能再去访问this指针;
最后说明了一句,如果this指针指向一个不具有虚析构函数的基类对象,往往会出现警告。

对于上面要注意的4点,有的即使不遵守也不会出现警告或者错误,但是会有安全隐患。因为delete this;语句得到调用后,指向该对象的指针就是野指针了,这时候内存中的内容可能保持完整并且可以被访问,使得数据仍然有效,但是安全的编码风格应该保证内存释放后不能再对它进行访问,避免潜在风险。

分享到:
评论

相关推荐

    深度探索C++对象模型(清晰版).pdf

    Lippman澄清了那些关于C++额外负荷与复杂度的各种错误信息和迷思,但也指出其中某些成本和利益交换确实存在。他阐述了各式各样的实现模型,指出它们的进化之道及其本质因素。书中涵盖了C++对象模型的语意暗示,并...

    深度探索C++对象模型 PDF

    深度探索C++对象模型 C++程序员必看编程书籍

    C++对象模型总结

    第1章 关于对象 第2章 构造函数语意学 第3章 Data语意学 第4章 Function语意学 第5章 构造、析构、拷贝语意学 第6章 执行期语意学 第7章 站在对象模型的尖端 第8章 C++对象模型总结 8.1 C++对象模型 8.2 单继承 ...

    深度探索c++对象模型(2012版本)

    深度探索c++对象模型(2012版本)

    深度探索C++对象模型 PDF中文清晰版

    Lippman澄清了那些关于C++额外负荷与复杂度的各种错误信息和迷思,但也指出其中某些成本和利益交换确实存在。他阐述了各式各样的实现模型,指出它们的进化之道及其本质因素。书中涵盖了C++对象模型的语意暗示,并...

    深度探索C++对象模型.pdf +清晰+完整+书签

    深度探索C++对象模型

    深度探索C++对象模型笔记.pdf

    深度探索C++对象模型的阅读笔记,可以看看别人是怎么学习C++的

    深度探索C++对象模型

    第1章 关于对象(Object Lessons) 加上封装后的布局成本(Layout Costs for Adding Encapsulation) 1.1 C++模式模式(The C++ Object Model) 简单对象模型(A Simple Object Model) 表格驱动对象模型(A Table-...

    C++对象模型

    《深度探索C++对象模型》重点探索"对象导向程序所支持的C++对象模型"下的程序行为。对于"对象导向性质之基础实现技术"以及"各种性质背后的隐含利益交换"提供一个清楚的认识。检验由程序变形所带来的效率冲击。提供...

    深入探索c++对象模型 设计模式c++ pdf

    深入探索c++对象模型 设计模式c++ pdf 深入探索c++对象模型 设计模式c++ pdf 深入探索c++对象模型 设计模式c++ pdf 深入探索c++对象模型 pdf 设计模式c++ pdf

    深度探索C++对象模型_中英

    深度探索C++对象模型_中英 深度探索C++对象模型_中英 深度探索C++对象模型_中英

    C++ 内存对象布局

    涉及各种情况下C++对象的sizeof大小,包括单一类对象,继承,重复继承 多继承 单一虚继承 等各种情况下的对象大小。对C++对象内存布局有清楚了解。

    (C++)深度探索C++对象模型_C++_

    C++对象模型

    深入探索C++对象模型-总结笔记.pdf

    总结笔记,关于侯捷翻译的《深入探索c++对象模型》的笔记 作者Lippman参与设计了全世界第一套C++编译程序cfront,这本书就是一位伟大的C++编译程序设计者向你阐述他如何处理各种explicit(明确出现于C++程序代码中)...

    C++对象内存布局

    介绍C++对象在内存中是怎样分布的,有助于深层学习C++。

    C++对象内存模型.pdf

    C++对象内存模型.pdf

    C++对象模型详解[收集].pdf

    C++对象模型详解[收集].pdf

Global site tag (gtag.js) - Google Analytics