请教:关于创建对象的弱智问题,高手勿入!

ah__fu 2004-08-10 02:11:21
大家好:
我是个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分配的空间。那么,创建一个对象的时候,对象本身是一个什么样的东东呢?为什么可以在堆上分配空间,也可以在栈上分配空间?
我想,是否可以把对象看成一个包含成员变量和函数指针型成员变量的结构体。既然是结构体,那么就可以在堆上和栈上分配空间了。但是,如果按照第二种方式,对象的构造函数会自动地调用吗?析构函数又会在什么情况下被调用呢?

实在是搞不懂,请大家帮忙!谢谢!
...全文
149 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kariya 2004-08-10
  • 打赏
  • 举报
回复
new MyClass():在堆中生成一个对象,new的对象只有在调用delete的时候才被析构,如果未delete很可能造成内存泄漏。

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

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

我认为改成这样就可以,没验证。^-^
MyClass *p;
MyClass MyObj = *(p=new MyClass());
delete p;
RookieStar 2004-08-10
  • 打赏
  • 举报
回复
C++既能在堆上产生对象:MyClass *pMyObj = new MyClass(); // pMyObj是用来访问该堆内存的指针,用->和*来操作。
也能在栈上产生对象:MyClass MyObj; // MyObj是一个完整的对象,用.和&来操作。

new和delete配对使用,只能用在已在堆上分配过内存的指针上:delete pMyObj; // Pass!
而MyObj不是指针,不能delete,但一旦MyObj的作用域结束,自动调用它的析构函数。
{
MyClass MyObj;
}// 这个大括号的结束代表着MyObj对象也被自动析构了。
Shires 2004-08-10
  • 打赏
  • 举报
回复
mark
lindex 2004-08-10
  • 打赏
  • 举报
回复
//====================
class MyClass; //定义了一个我自己的类
…………
MyClass MyObj; //在栈中生成对象
MyClass MyObj = *(new MyClass()); //这样就错了,因为new返回一个在堆中生成的对象的地址
MyObj.field1 = 11; //访问成员
//delete &MyObj; //错误,不能释放对象,delete只能释放指针(由new返回的指针)指向的对象

骗一骗编译器好了。
lemon520 2004-08-10
  • 打赏
  • 举报
回复
//====================
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指针完成调用的
renheihei 2004-08-10
  • 打赏
  • 举报
回复
delete:析构函数--〉free空间
renheihei 2004-08-10
  • 打赏
  • 举报
回复
我的理解:
第一种情况和第二种情况都会调用构造函数的,在创建对象的时候,构造函数无论如何
得调用,这是为了保证初始化的安全(new:分配空间,然后调用构造函数)。
析构函数delete时,也是要调用的。如果不是在堆上分配空间,遇到}也会调用。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧