最近被指针弄糊涂了,下面是一段代码,请各位高手看看,谢谢啦!
char *test();
void Test3(void);
void main()
{
char *test1 = NULL;
test1 = test();
cout<<test1<<endl;
//delete test1; //请问为什么不能用这条语句?如果不用会不会发生内存泄露?....1
test1 = NULL;
Test3();
cout<<endl;
}
char *test()
{
char *test = NULL;
test = new char;
strcpy(test,"test test");
return test;
}
char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num);
return p;
}
void Test3(void)
{
char *str = NULL;
str = GetMemory3(100);
strcpy(str, "hello");
cout<< str << endl;
free(str); //为什么这里可能释放内存吧上面就不能用呢?? ..... 2
}
请问为什么1 不能,而2却可以,难道是C和C++在这方面有不同?
问题点数:80、回复次数:13Top
1 楼carylin(林石)回复于 2004-12-03 14:04:38 得分 8
1也可以用,不过应该把
delete test1;
改成
delete []test1;
还有把
test = new char;
改成
test = new char[50]; //不是申请一个字符,而是字符串
Top
2 楼avalonBBS("︶.︶メ)→( ̄ε ̄メ)回复于 2004-12-03 14:05:08 得分 10
#include <stdio.h>
#include <iostream>
using namespace std;
=======================我在dev c++下编译没任何问题啊
另你的char *test()
函数中test = new char;//有误啊
Top
3 楼steedhorse(晨星)回复于 2004-12-03 14:07:08 得分 10
char *test()
{
char *test = NULL;
test = new char;
strcpy(test,"test test");
return test;
}
这个函数有问题,你只分配了一个字符的空间,却使用strcpy往里拷贝了十多个字符长的字符串。可是申请16个,拷贝你那个"test test"就足够了。
test = new char[16];
1必须有的,但问题是test函数也得没问题才行。
不过如果申请多个空间,删除的时候应该使用:
delete[] test1;
char *GetMemory3(int num),这个不错,申请了100个字符的空间。Top
4 楼zhouyong0371(小周周)回复于 2004-12-03 14:09:58 得分 10
#include <iostream.h>
#include <malloc.h>
#include <string.h>
char *test();
void Test3(void);
void main()
{
char *test1 = NULL;
test1 = test();
cout<<test1<<endl;
delete [] test1; //释放
test1 = NULL;
Test3();
cout<<endl;
}
char *test()
{
char *test = NULL;
test = new char[12];//这样就没有问题了,你的代码只申请了一个byte的空间,越界了
strcpy(test,"test test");
return test;
}
char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num);
return p;
}
void Test3(void)
{
char *str = NULL;
str = GetMemory3(100);
strcpy(str, "hello");
cout<< str << endl;
free(str); //为什么这里可能释放内存吧上面就不能用呢?? ..... 2
}
Top
5 楼xuyun11141(用心工作,用心生活)回复于 2004-12-03 14:26:07 得分 0
哦,果然如上各位高手所说,我再想问一个问题,如果我不知道这个字符串的长度,应该如何为该 字符串申请内存?Top
6 楼steedhorse(晨星)回复于 2004-12-03 14:42:47 得分 6
没有办法,只能申请长一些,或者使用strncpy。
Top
7 楼qfxx(秋风萧萧)回复于 2004-12-03 14:45:23 得分 6
在test1函数中使用strlen
char* test(){
int i = strlen("test test");
char *str=new char[i+1];//别忘了字符串结束标志
strcpy(...);
return str;
}Top
8 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-12-03 15:10:30 得分 6
嗯,你需要用数组来存放,你new只申请了一个字符空间Top
9 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-12-03 15:17:31 得分 0
长度不确定,就申请多一点Top
10 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2004-12-03 15:22:37 得分 6
hehe 是喔
new char...才一個byte...Top
11 楼homtipo()回复于 2004-12-03 21:02:03 得分 6
你的test1都没有用new分配空间,用delete干吗?这是要配对出现的。
还有你的test只分配了一个char地址空间,却要放这么多东东,虽然能通过,但是后面的内容都会丢失的。
而GetMemory3(100)分配了100个char空间,你可以看看它的源程序,用free可以。Top
12 楼greenteanet(扎扎实实打基础,保持一颗平常心。)回复于 2004-12-03 22:44:33 得分 6
多分配点空间吧,你可以动态的分配内存啊..Top
13 楼aa1298(萧萧)回复于 2004-12-03 22:50:34 得分 6
分配的空间不够大Top




