LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: KMnO4

问一个C++语法问题

[复制链接]
发表于 2004-11-26 17:35:48 | 显示全部楼层
最初由 KMnO4 发表
谢谢。

如果有如下声明:

GenListNode a;

是否已为a分配内存空间了呢?

这样的话,还可以使用 a=b.Info(elem);么?原来a占的内存空间如何处理?

数据结构已经看过好多遍了,正为C++的语法苦恼。


a 应该在堆栈里吧。
发表于 2004-11-26 17:44:53 | 显示全部楼层
a是在栈里,但是a的资源也就是a->pitem所指的东西可能在堆里,这要看构造函数,也可能还没有为pitem分配空间
发表于 2004-11-26 18:04:10 | 显示全部楼层
没看清楚,搞错了
发表于 2004-11-26 18:17:08 | 显示全部楼层
最初由 KMnO4 发表
谢谢。

如果有如下声明:

GenListNode a;

是否已为a分配内存空间了呢?

这样的话,还可以使用 a=b.Info(elem);么?原来a占的内存空间如何处理?

数据结构已经看过好多遍了,正为C++的语法苦恼。


GenListNode a; 编译器自然会为该对象分配空间,而且会调用你为GenListNode写的构造函数或者默认构造函数。

至于 a=b.Info(elem);自然是符合C++语法的,注意,符合语法未必就是稳妥的事,关键在于'=' 重载的状况。a原来的空间仍然是原来的空间,成员变量会以b.info()来进行拷贝,包括指针。
发表于 2004-11-26 18:21:02 | 显示全部楼层
2,要销毁堆中的对象就是new来的对象要用delete
比如将a=info(...),要销毁对象a就用delete &a。
而在析构函数里只是释放对象所占用的资源,比如类
中有一个指针,用new为给指针在堆中分配了空间,就要在析构函
数里delete这个指针释放对象的资源。
栈中的对象在超过他的生命期,系统会自动调用析构函数销毁
堆中的对象必须用delete销毁
delete对象时实际上调用了类的析构函数。

改一下,把a=info()改成a=&info().a=info要调用拷贝构造函数或=运算符
要给a分配空间,a=&info()的话就不分配空间了,a的到的时info里面* pitem
的空间。要销毁a直接delete &a就可以了。
 楼主| 发表于 2004-11-26 18:30:51 | 显示全部楼层
楼上的兄弟。我声明a的时候不是用的动态内存分配啊。

我在info函数里使用了new
我怎样得到这个new到的空间的地址呢?


我就不明白为什么殷老师为什么不返回指针,而要返回一个引用。郁闷。
发表于 2004-11-26 18:44:02 | 显示全部楼层
GenListNode* a=&Info(b);//直接delete a;

GenListNode a=Info(b)//我觉得不应该这样用;
可以这样
GenListNode* p=&Info(b);
GenListNode a=*p;//调用拷贝构造函数或operator=
delete p;
发表于 2004-11-26 18:50:32 | 显示全部楼层
也可以
GenListNode& a=Info(b);//delete &a;
发表于 2004-11-26 19:02:22 | 显示全部楼层
我原来搞错了,前后帖子矛盾了哈,我把原来的帖子改了。
看来自己很多东西还是不清楚
发表于 2004-11-26 19:05:39 | 显示全部楼层
嘿嘿。。。对于精通编译的人,“语言于之如浮云”。
可惜我太菜了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表