关于析构函数?? 没看懂!
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
struct name{
char *contents;
name (char *name);
~name();
};
name::name(char *name)
{
int len=strlen(name);
contents=new char[len+1];
strcpy(contents,name);
}
name::~name()
{
cout<<"~~~~~~~~~~`"<<contents<<endl;
}
void client()
{
name n1("jones");
name *p=new name("liukun");
delete p; //只有p啊!!????n1的地址怎么删的?
}
int main()
{
client();
getchar ();
return 0;
}
输出结果是 ~~~~~~~~~~~~jones
~~~~~~~~~~~~liukun
delete不是 只把*p指向的地址删除了吗?为什么也把n1也删了
谁能帮我说明以下
顺便在说一下析构函数 谢谢了!
问题点数:10、回复次数:7Top
1 楼Caoyu015(酷鱼一代)回复于 2003-02-04 16:10:41 得分 10
p 是在回收指针所指向的内存空间时,调用其析构函数。
n1时局部量,是在退出函数局部域的时候由系统自动调用它的析构函数。
关于析构函数,详细的书上应该有介绍,你还是看看书吧!!!Top
2 楼rtdb(东临碣石)回复于 2003-02-04 16:46:35 得分 0
n1是在声明时构造, 出了作用域时(那个})时,由系统自动调用析构。
p是指针, 在new时构造, delete时析构。Top
3 楼kevinh(每天一个太阳)回复于 2003-02-05 10:17:21 得分 0
析够只是析够指针变量,不会删除地址的Top
4 楼xly12(独居长空)回复于 2003-02-05 12:05:58 得分 0
析构函数是释放对象所占的系统资源,其功能与构造函数正好相反。一般这两个函数由系统自动调用执行的。Top
5 楼langhaixin(C++如此多娇,引无数高手尽折腰!)回复于 2003-02-05 13:30:00 得分 0
oK,首先nl是个栈对象(就是nl是别放在一个stack的存储空间里的,而p是放在一个heap的存储空间里)nl的析构函数 destructor 是有系统否则调用,就是当nl的生命周期结束的时候,自动调用。而释放p占有的内存,有用户指定使用delete释放,而delete则会隐式的调用析构函数。
还有关于变量的生存周期的问题你可以找相关的书籍看看,或是是看CSDN的FAQ,应该都有讨论。
推荐你两本书Effective C++和More Effective C++ 电子版的下载地址
http://download.pchome.net/php/download2.php?sid=11136&url=/development/reference/MEC0410.zip&svr=4
http://www.dingbing.com/book/effect_c_cn.zipTop
6 楼robbie24(独行虾)回复于 2003-02-05 13:43:54 得分 0
你应该好好看看函数那章了~
函数的相关变量都在运行stack中,n1是局部变量~函数client一到执行结束自然就释放所有其内部变量,n1没有了,指针变量p也会消失~,但是,p所指向的堆内存是存在的!这个错误是很容易忽视的,如果要使用这段内存,你必须要讲client函数的返回类型改为name* 否则是内存泄露
Top
7 楼edisonkun(简单代码)回复于 2003-02-05 23:12:22 得分 0
恩 等我把类的基础看完 在看,,,这些东西吧
谢谢大家了Top




