请教一个关于内存的问题!
AnsiString* __fastcall TForm2::TestStrPoint(AnsiString *Str)
{
if(Str==NULL)
{
Str= new AnsiString("");
}
int i=2;
*Str = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
i =1;
return Str;
}
void __fastcall TForm2::Button2Click(TObject *Sender)
{
AnsiString *Str;
TestStrPoint(Str);
}
以上代码:想知道为什么传过去的地址不为空或者说没有new的指针不为空!
第二:在TestStrPoint里这样new分配的内存,要在外面或里面显式的调用delect来释放吗?
小弟初学CBC,求大牛们指教
[解决办法]
问题一:
AnsiString *Str;
我们先把AnsiString 换成简单类型,比如 char *p;
要是p不去指定的话,内存中p位置里可能有其他值存在
可以做个实验:
int i;
printf("%d",i);//去看看i是否为0
这就是你的第一个问题:为什么传过去的地址不为空
问题二:
AnsiString是为了和delphi的字符串类兼容的特殊的类,不要搞这么复杂
从你的函数可以看出,str非空,将赋值为"AAAAAAAAAAAAAAAAAAAAA"
你可以这样做
AnsiString __fastcall TForm2::TestStrPoint(AnsiString Str)
{
AnsiString a1=str;
if(a1=="")a1="AAAAAAAAAAAAAAAAAAA";
return a1;
}
void __fastcall TForm2::Button2Click(TObject *Sender)
{
AnsiString Str;
Str=TestStrPoint(Str);
}
最后送你一句话,不要把简单的事情复杂化,而是把复杂的东西分解成简单的小事去解决
[解决办法]
你的目的其实就是问了类似这个结果 String *str = new String("123");
直接这样写就可以了
你的代码先去用String *str;
str = new String("");
后面再用str = new String("AAAAAA");
这个时候str与之前的""之间没有指向了,C++不像java,在没有指向关系的时候不会进行垃圾回收
所以这样写应该是有问题的
[解决办法]
如果说你需要这样写,需要一个没有分配内存的
那就写String *str = NULL;
判断写if(str == NULL) 没问题
就像我们定义一写基本的变量的时候给个初始值一样 int a = 0;
[解决办法]
void __fastcall TForm2::Button2Click(TObject *Sender)
{
AnsiString *Str;
TestStrPoint(Str);
}
AnsiString *Str;这里没有赋NULL值,所以在你进入TestStrPoint(Str)函数进行判空时,Str此时不是NULL,有指向野的地址,所以*Str = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"是给野指针赋值,当然报错