关于析构函数?? 没看懂!

edisonkun 2003-02-04 03:59:34
#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也删了
谁能帮我说明以下
顺便在说一下析构函数 谢谢了!
...全文
31 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xly12 2003-02-05
  • 打赏
  • 举报
回复
析构函数是释放对象所占的系统资源,其功能与构造函数正好相反。一般这两个函数由系统自动调用执行的。
edisonkun 2003-02-05
  • 打赏
  • 举报
回复
恩 等我把类的基础看完 在看,,,这些东西吧

谢谢大家了
「已注销」 2003-02-05
  • 打赏
  • 举报
回复
析够只是析够指针变量,不会删除地址的
robbie24 2003-02-05
  • 打赏
  • 举报
回复
你应该好好看看函数那章了~
函数的相关变量都在运行stack中,n1是局部变量~函数client一到执行结束自然就释放所有其内部变量,n1没有了,指针变量p也会消失~,但是,p所指向的堆内存是存在的!这个错误是很容易忽视的,如果要使用这段内存,你必须要讲client函数的返回类型改为name* 否则是内存泄露
langhaixin 2003-02-05
  • 打赏
  • 举报
回复
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.zip
rtdb 2003-02-04
  • 打赏
  • 举报
回复
n1是在声明时构造, 出了作用域时(那个})时,由系统自动调用析构。

p是指针, 在new时构造, delete时析构。
Caoyu015 2003-02-04
  • 打赏
  • 举报
回复
p 是在回收指针所指向的内存空间时,调用其析构函数。
n1时局部量,是在退出函数局部域的时候由系统自动调用它的析构函数。

关于析构函数,详细的书上应该有介绍,你还是看看书吧!!!

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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