首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

请问一个关于内存的有关问题

2012-06-11 
请教一个关于内存的问题!AnsiString* __fastcall TForm2::TestStrPoint(AnsiString *Str){if(StrNULL){S

请教一个关于内存的问题!
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"是给野指针赋值,当然报错

热点排行