char * 型 内存的回收处理~

duoshanx 2009-06-04 12:41:08
#include <iostream>
using namespace std;
class mojiretu{
public:
mojiretu(const char *n){
name = new char(strlen(n)+1);
strcpy(name,n);
}
mojiretu(char n){
name= new char(2);
name[0]=n;
name[1]='\0';
}
void show(){cout << name << endl;}
~mojiretu(){
if (name!=NULL) delete[] name;
cout << "-END-\n";
}
private :
char *name;

};

int main(){
mojiretu m1("watanabe");
m1.show();

mojiretu m2('x');
m2.show();
}
----------------
以为new char()了,所以内存一定要回收,
但回收的时候提示
HEAP CORRUPTION DETECTED:....
难道已经自动回收了吗?

请指教。
...全文
454 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lingyin55 2009-06-04
  • 打赏
  • 举报
回复
需要手动添加'\0'

[Quote=引用 4 楼 duoshanx 的回复:]
C/C++ code
#include <iostream>
using namespace std;
class mojiretu{
public:
mojiretu(const char *n){
name = new char[strlen(n)+1];
strcpy(name,n);
name[strlen(n)]='\0'; //<---这里也忘记加上'\0'了,再追问一句,strcpy之后,需要加'\0'吗?
}
mojiretu(char n){
name= new char[2];
name[0]=n;
name[1]='\0';
}
void …
[/Quote]
duoshanx 2009-06-04
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;
class mojiretu{
public:
mojiretu(const char *n){
name = new char[strlen(n)+1];
strcpy(name,n);
name[strlen(n)]='\0'; //<---这里也忘记加上'\0'了,再追问一句,strcpy之后,需要加'\0'吗?
}
mojiretu(char n){
name= new char[2];
name[0]=n;
name[1]='\0';
}
void show(){cout << name << endl;}
~mojiretu(){
delete[] name;
cout << "-END-\n";
}
private :
char *name;

};

int main(){
mojiretu m1("watanabe");
m1.show();

mojiretu m2('x');
m2.show();

mojiretu m3("abc");
m3.show();
}


-------------------------
再追问一句,strcpy之后,需要加'\0'吗?
duoshanx 2009-06-04
  • 打赏
  • 举报
回复
Thanks !!
effective_person 2009-06-04
  • 打赏
  • 举报
回复
清区分
new char[2] 和 new char(2)
#include <iostream> 
using namespace std;
class mojiretu
{
public:
mojiretu(const char *n)
{
name = new char[strlen(n)+1]; // here
strcpy(name,n);
}

mojiretu(char n)
{
name= new char[2]; // here
name[0]=n;
name[1]='\0';
}
void show()
{
cout << name << endl;
}
~mojiretu()
{
if (name!=NULL)
delete[] name;
cout << "-END-\n";
}
private :
char *name;

};

int main()
{
mojiretu m1("watanabe");
m1.show();

mojiretu m2('x');
m2.show();
}
adventurelw 2009-06-04
  • 打赏
  • 举报
回复
new char(2)是将char初始化为编码为2的字符,应该用delete name;

但你明明name是个字符串,所以初始化分配时应该是new char[2];然后就可以用delete [] name了。
duoshanx 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wanyuzhen 的回复:]

new char(2),在堆上建立一个char类型空间,并把2赋值
实际上只开辟了一个char.类似构造函数
[/Quote]
我不是很明白。
可能你是说括号()调用了构造函数,把2传给构造函数。?!
wanyuzhen 2009-06-04
  • 打赏
  • 举报
回复

new char(2),在堆上建立一个char类型空间,并把2赋值
实际上只开辟了一个char.类似构造函数
duoshanx 2009-06-04
  • 打赏
  • 举报
回复
to lingyin55
谢谢, 回答的够细,够N。

to snail_1989
这是公司的练习题,我是新入社员:)

to sszwbuaa woods2001
多谢捧场,我也忙了半天没找到原因,嘿嘿
woods2001 2009-06-04
  • 打赏
  • 举报
回复
原来是这样个错误·
楼主一点细节 没注意好~
sszwbuaa 2009-06-04
  • 打赏
  • 举报
回复
被LZ骗了,应该是[],不是(),我还调试了半天。。。
name = new char[strlen(n)+1]
name= new char[2];
crst_zh 2009-06-04
  • 打赏
  • 举报
回复
strcpy()源码:

char * __cdecl strcpy(char * dst, const char * src)
{
char * cp = dst;

while( *cp++ = *src++ )
; /* Copy src over dst */

return( dst );
}

看看,先赋值了,然后再检查是不是为'\0'的,也就是说,'\0'是被复制了的。
snail_1989 2009-06-04
  • 打赏
  • 举报
回复
楼至的类名很古怪啊 [mojiretu]文字列(もじれつ)
crst_zh 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lingyin55 的回复:]
需要手动添加'\0'

引用 4 楼 duoshanx 的回复:
C/C++ code
#include <iostream>
using namespace std;
class mojiretu{
public:
mojiretu(const char *n){
name = new char[strlen(n)+1];
strcpy(name,n);
name[strlen(n)]='\0'; // <---这里也忘记加上'\0'了,再追问一句,strcpy之后,需要加'\0'吗?
}
mojiretu(char n){
name= new char[2];…
[/Quote]

不需要加'\0',看看是strcpy的源码吧,最后一个0也是拷贝过去了的。

另外最好在析构里面这样写:
~mojiretu(){
delete[] name;
name=NULL;
cout << "-END-\n";
}

duoshanx 2009-06-04
  • 打赏
  • 举报
回复
为什么呢?

65,211

社区成员

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

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