C++ 销毁一个自定义对象后,它里面的成员方法去哪儿了?

#include <iostream>
using namespace std;

class TestClass
{
public:
	void Print()
	{
		cout << "hello" << endl;
		//_a++;
	}

protected:
	//int _a = 0;
};

int main()
{
	TestClass *tc = new TestClass();
	delete tc;
	tc = NULL;
	tc->Print();
	return 0;
}

类似如上模型的代码 坑了我好久

下面是我今天下午的遭遇:

注意main函数中,我首先申请了一块 tc类型的对象

紧接着我把它delete 并将指向它的指针置为NULL了

然而这时候,执行 tc->Print()  是可以的,程序可以输出 hello

但如果紧接着将代码中的2行注释放开,也就是在类中定义一个成员对象a,并在成员方法Print中访问这个对象,程序立马挂掉,而这不论是g++ 还是 Visual Studio 在编译的过程中都是不会报错的

为什么会这样呢?

原因很简单

一个对象,定以后,成员对象和成员方法都存放在代码段

一旦new 出来这个对象, 其中的成员对象是跟对象本身一起存放在堆区的,

可是,成员方法(非静态) 依然放在代码段

所以,在析构、销毁对象的时候,只会把堆中的东西,也就是成员对象delete掉,

所以这时候是能访问进成员对象的

而C++这么做,是为了节省资源,毕竟相同类型的不同对象之间,可能又不同的成员对象,但它们的成员方法(非静态)都是可以通用的

而这个问题,编译器目前是检查不出来的,因为编译器查错是在代码执行前进行的,而这个问题是代码执行的过程中产生的

这种问题一旦出现确实不太好找,不过归根到底 都是水平太菜啊。。

时间: 2024-08-26 06:42:34

C++ 销毁一个自定义对象后,它里面的成员方法去哪儿了?的相关文章

JavaScript实现自定义对象的自定义事件

前言: 大家都知道,在使用JavaScript可以很方便的使用addEventListener函数给DOM对象快速绑定一个或多个事件侦听器. 我们又如何在JavaScript的自定义对象中使用此方法并触发事件呢?这就是本章节的核心内容了. 目的: 现在有一个需求,要求"a对象"能够让"b对象"做一系列动作. 分析后我们得知.首先,"b对象"有一个固定名称作为入口让a对象调用,并且这个入口可以自动检索所有符合这个动作要求的函数并依次触发. 实现:

OC-多个自定义对象的归档与解归档

对于上一章节,简单讲述了一个自定义对象的归档与解归档:http://www.cnblogs.com/BeyondAverage0908/p/4597245.html 本章节阐述下多个自定义对象的归档与解归档 以下代码阐述:定义了两个类Dog和Cat,并且利用@property展开了对应的几个属性(简单的代码,不贴源码了). 以下代码部分位主要的归档与解归档代码:注意需要在对应的自定义类中实现以下两个方法:- (void)encodeWithCoder:(NSCoder *)aCoder;方法,-

匿名类型与Select方法实现自定义对象插入局部表结构中

在提取局部表结构数据时,通过Select选取需要的字段,如下句,此时其实产生了一个不用于_menuMan的原新数据类型new { c.SYS_COMMANDS_ID,c.TXT_COMMANDTITLE },这样的类型就叫匿名类型 var comdList = _menuMan.Load(c => c.FATHER_ID == null).OrderBy(c=>c.VAL_DISPLAYORDERID).Select(c=>new { c.SYS_COMMANDS_ID,c.TXT_CO

Javascript-自定义对象转换成JSon后如何再转换回自定义对象

man是自定义的对象,使用var tim = JSON.stringify(man); var newman=JSON.parse(tim)后newman的类型是"object"并不是一个Man,怎么才能变回一个Man呢? function Man() { this._type = "man"; this.name=""; this.run = function () { alert("run!!"); alert(this.

无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent&

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法 对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的. 1 public class TT implements Runnable { 2 int b = 100; 3 public synchronized void m1(){ 4 b = 10000; 5 try { 6 Thread. sleep(5000); 7 System. out.prin

CAD由一个自定义实体事件中的id得到自定义实体对象(com接口VB语言)

由一个自定义实体事件中的id得到自定义实体对象.该函数只能在自定义实体事件中调用. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 If sEventName = "MxDrawXCustomEntity::explode" Then             Dim param66 As M

IOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档

1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒应用沙盒的文件系统目录,如下图所示(假设应用的名称叫Layer)模拟器应用沙盒的根路径在: (apple是用户名, 8.0是模拟器版本)/Users/apple/Libra

jQuery基础(常用插件 表单验证,图片放大镜,自定义对象级,jQuery UI,面板折叠)

1.表单验证插件--validate   该插件自带包含必填.数字.URL在内容的验证规则,即时显示异常信息,此外,还允许自定义验证规则,插件调用方法如下: $(form).validate({options}) 其中form参数表示表单元素名称,options参数表示调用方法时的配置对象,所有的验证规则和异常信息显示的位置都在该对象中进行设置.     2.表单插件--form 通过表单form插件,调用ajaxForm()方法,实现ajax方式向服务器提交表单数据,并通过方法中的option