关于new创建对象的弱智问题

大家好: 
      我是个C++菜鸟。 
      现在我有一个关于new操作符创建对象的弱智问题,请大家帮忙解决: 
//==================== 
class   MyClass;     //定义了一个我自己的类 
………… 
MyClass   *pMyObj   =   new   MyClass();     //创建对象的实例 
pMyObj-> field1   =   11;     //访问成员 
delete   pMyObj;     //释放对象 

//==================== 
class   MyClass;     //定义了一个我自己的类 
………… 
MyClass   MyObj;     //这样为什么也能申明对象的实例? 
//MyClass   MyObj   =   new   MyClass();     //这样就错了 
MyObj.field1   =   11;     //访问成员 
//delete   MyObj;     //释放对象,错误,不能释放对象 


//=========================================== 
        看了刚才的代码,大家可能明白我的问题了:new操作符返回新空间的指针,delete删除由new分配的空间。那么,创建一个对象的时候,对象本身是一个什么样的东东呢?为什么可以在堆上分配空间,也可以在栈上分配空间? 
        我想,是否可以把对象看成一个包含成员变量和函数指针型成员变量的结构体。既然是结构体,那么就可以在堆上和栈上分配空间了。但是,如果按照第二种方式,对象的构造函数会自动地调用吗?析构函数又会在什么情况下被调用呢? 

        实在是搞不懂,请大家帮忙!谢谢! 
 
 
  • renheihei用户头像
  • renheihei
  • (请大家注意:用DEV C++作)
  • 等 级:
#1楼 得分:20回复于:2004-08-10 14:18:47
我的理解: 
  第一种情况和第二种情况都会调用构造函数的,在创建对象的时候,构造函数无论如何 
  得调用,这是为了保证初始化的安全(new:分配空间,然后调用构造函数)。 
  析构函数delete时,也是要调用的。如果不是在堆上分配空间,遇到}也会调用。 
  
 
  • renheihei用户头像
  • renheihei
  • (请大家注意:用DEV C++作)
  • 等 级:
#2楼 得分:0回复于:2004-08-10 14:19:27
delete:析构函数--〉free空间
 
#3楼 得分:30回复于:2004-08-10 14:32:55
//==================== 
class   MyClass;   ………… 
MyClass   *pMyObj   =   new   MyClass();   //在堆上分配空间,然后调用MyClass的默认构造函数 
pMyObj-> field1   =   11;     //访问成员 
delete   pMyObj;     //new出来的对象必须用delete释放。delete先调用MyClass的析构数,然后回收内存 

//==================== 
class   MyClass;     //定义了一个我自己的类 
………… 
MyClass   MyObj;     //在栈中生成对象 
MyClass   MyObj   =   new   MyClass();     //这样就错了,因为new返回一个在堆中生成的对象的地址 
MyObj.field1   =   11;     //访问成员 
//delete   MyObj;     //错误,不能释放对象,delete只能释放指针(由new返回的指针)指向的对象 

另外:对象在一般情况下是数据成员的集合(不含虚的东东),而没有函数指针,成员函数是通过隐式的this指针完成调用的 
 
#4楼 得分:20回复于:2004-08-10 14:58:53
//==================== 
class   MyClass;     //定义了一个我自己的类 
………… 
MyClass   MyObj;     //在栈中生成对象 
MyClass   MyObj   =   *(new   MyClass());     //这样就错了,因为new返回一个在堆中生成的对象的地址 
MyObj.field1   =   11;     //访问成员 
//delete   &MyObj;     //错误,不能释放对象,delete只能释放指针(由new返回的指针)指向的对象 

骗一骗编译器好了。
 
  • Shires用户头像
  • Shires
  • (Trombone)
  • 等 级:
#5楼 得分:0回复于:2004-08-10 15:02:58
mark
 
#6楼 得分:30回复于:2004-08-10 15:58:40
C++既能在堆上产生对象:MyClass   *pMyObj   =   new   MyClass();       //   pMyObj是用来访问该堆内存的指针,用-> 和*来操作。 
也能在栈上产生对象:MyClass   MyObj;     //   MyObj是一个完整的对象,用.和&来操作。 

new和delete配对使用,只能用在已在堆上分配过内存的指针上:delete   pMyObj;   //   Pass! 
而MyObj不是指针,不能delete,但一旦MyObj的作用域结束,自动调用它的析构函数。 

MyClass   MyObj; 
}//   这个大括号的结束代表着MyObj对象也被自动析构了。
 
  • kariya用户头像
  • kariya
  • (轻驰)
  • 等 级:
#7楼 得分:0回复于:2004-08-10 16:57:44
new   MyClass():在堆中生成一个对象,new的对象只有在调用delete的时候才被析构,如果未delete很可能造成内存泄漏。 

MyClass   MyObj:在栈中生成一个对象,自动调用析构函数释放空间。 

MyClass   MyObj   =   new   MyClass();   类型不匹配不能赋值,左边是MyClass类型,右边是MyClass*类型。 

我认为改成这样就可以,没验证。^-^ 
MyClass   *p; 
MyClass   MyObj   =   *(p=new   MyClass()); 
delete   p;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值