C++低手请问一个new 与delete 的问题

yuchonghuang 2010-06-16 11:06:37
先附上源代码:
cclass.h
*****************************
#pragma once

class CClass
{
public:
CClass(void);
~CClass(void);
CClass* Clone(void);
void show(void);
};
******************
cclass.cpp
***************

#include "StdAfx.h"
#include "Class.h"

CClass::CClass(void)
{
}

CClass::~CClass(void)
{
}

CClass* CClass::Clone(void)
{
CClass *c = new CClass();
return c;
}

void CClass::show(void)
{
cout<<"void CClass::show(void)"<<endl;
}


************************
main.cpp
***********************

CClass * cl = new CClass();
cl->show();
delete cl;
CClass *ne =cl->Clone();
cl = NULL;
ne->show();
delete ne;
ne = NULL;
*************************

问题:问什么delete cl 后调用cl->Clone(); 不会出错?


...全文
78 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kusey 2010-06-16
  • 打赏
  • 举报
回复
我试了一下,给这个类添加一个成员数据,在Clone里面使用该成员数据,程序还是可以运行。不解!
sun6623518 2010-06-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 npuhuxl 的回复:]
而且我觉得cl空间在delete并没有直接被系统收回
[/Quote]

是收回了
类初始化的时候只有数据成员才需要分配空间,成员函数是不需要的。
所以对象指针能调用不操作数据的函数
liutengfeigo 2010-06-16
  • 打赏
  • 举报
回复
cl= null;
cl->clone也应该没有问题
C1指向null之后还可以指回去。
yuchonghuang 2010-06-16
  • 打赏
  • 举报
回复
明白了:下面这样就会出现期望的结果:
***************
cclass.h
***************
#pragma once

class CClass
{
public:
CClass(void);
~CClass(void);
CClass* Clone(void);
void show(void);

int i;
};
***************
cclass.cpp
***************

#include "StdAfx.h"
#include "Class.h"

CClass::CClass(void)
{
i = 0;
}

CClass::~CClass(void)
{
}

CClass* CClass::Clone(void)
{
i = 5;
CClass *c = new CClass();
return c;
}

void CClass::show(void)
{
i = 6;
cout<<"void CClass::show(void)"<<endl;
}

不知我的理解是否正确????
yuchonghuang 2010-06-16
  • 打赏
  • 举报
回复
有点不明白,能否请3楼再说明白点?小弟愚钝。
mstlq 2010-06-16
  • 打赏
  • 举报
回复
3楼正确……
楼主可以结贴了
npuhuxl 2010-06-16
  • 打赏
  • 举报
回复
而且我觉得cl空间在delete并没有直接被系统收回
kusey 2010-06-16
  • 打赏
  • 举报
回复

不解!
npuhuxl 2010-06-16
  • 打赏
  • 举报
回复
clone函数没有改变CClass对象,也没有使用c1所指向的空间的内容

clone函数调用的时候只是使用了c1所指向内容的地址而已,即时
cl= null;
cl->clone也应该没有问题
yuchonghuang 2010-06-16
  • 打赏
  • 举报
回复
顺便说一下,我用的编译器是vs2008
Gary@Tokyo 2010-06-16
  • 打赏
  • 举报
回复
这个问题得好好看看
巧合?还是因为在运行,没有删除?
没编译器在旁边
等高手给详细解释。
pokemonhxh 2010-06-16
  • 打赏
  • 举报
回复
delete 绝对是吧内存回收了,你访问成员数据是没定义的数据。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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