请教:通过AnsiString生成的char[], 怎么在内存中释放,自动的吗???

lw8122 2006-07-06 01:58:16
问题见题目。

代码1:
char *a="aaaaaaaaaaaaaaaaaaaaaaa";
char b[100];
这时,a和b都是静态内存,无需要删除。


代码2:
char *a=new char[20];
strcpy(a,"asdfasdfsdfd");
char *b=new char[20];
//.................................
delete []a;
delete []b;
这时,a和b都是动态分配的,必须delete


代码3:
AnsiString as="aaaaaaaaaaaaaaaaaaaaaaaaaaaa";
char *a=as.c_str();
as=as+"bbbbbbbbbbbbbbbbbbbbbbb";
char *b=as.c_str();

这时,a和b所指向的字符串,内存应该是动态的吧,那么,如果释放这个内存?? 系统会自动摆平吗???
...全文
177 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lw8122 2006-07-06
  • 打赏
  • 举报
回复
????

贴子结了,咋个看不到我给的分呢???

晕倒!!!

这种问题怎么处理啊!?
lw8122 2006-07-06
  • 打赏
  • 举报
回复
to 鱼儿:

谢谢解答,这个只是模拟代码哈,实际使用,我当然会避免啦:)
xiaoshi0 2006-07-06
  • 打赏
  • 举报
回复
这个代码没什么问题,不过并不能保证以后不会在这之间插入其他代码,而且由于你将指针进行了赋值,很容易导致野指针的产生。

这是一种不好的编程习惯。
lw8122 2006-07-06
  • 打赏
  • 举报
回复
等等,看到不同意见。。。。。。

引用:代码a可以, b c都不行

问一下不惑兄:

代码b:
AnsiString as="aaaaaaaaaaaaaaaaaaaaaaaaaaaa";
char *a=as.c_str();
char *b=new char[1024];
strcpy (b,a);
//。。。。。。代码部分
delete [b];

在取得as.c_str()和执行strcpy之间,as并未发生任何改变,难道也会发生不稳定的情况况,造成b中得到的内容有误????

为什么????
daydayup234 2006-07-06
  • 打赏
  • 举报
回复
应该说明白了

“代码3:”
就别这么用,也就不牵扯你的疑问了。
lw8122 2006-07-06
  • 打赏
  • 举报
回复
明了,感谢,结贴!!!!
cczlp 2006-07-06
  • 打赏
  • 举报
回复
代码a可以, b c都不行
xiaoshi0 2006-07-06
  • 打赏
  • 举报
回复
他说的临时内存是这样的,由于AnsiString可以动态改变大小,所以并不能保证每次你改变大小以后,AnsiString不会重新分配内存来适应新的大小

但有一点可以肯定,AnsiString中也是用字符串来分配的,当你用c_str()来获得字符串地址的时候,它会将当前AnsiString中分配的字符串的首地址返回给你。

不过下次你可能又动态的增加了AnsiString字符串的长度,这时它会重新分配一个更大的空间,然后将原来的数据和你新加的数据一起放过去,然后再删除原来的字符串缓冲区,这时,你原来读出的那个字符串地址就是野指针了。
daydayup234 2006-07-06
  • 打赏
  • 举报
回复
看看这个
http://www.chinabcb.com/bbs/viewtopic.php?t=9470
不知道AnsiString char*
若了多少官司
3996906 2006-07-06
  • 打赏
  • 举报
回复
AnsiString分配的空间好象在堆上会偏移的。。只能每次读的时候用下.c_str()

最好是strcpy。。
lw8122 2006-07-06
  • 打赏
  • 举报
回复
不惑兄:

是否可以这么理解????

as.c_str分配的为临时内存

在对as做修改,或对as再进行一次as.c_str()的操作,或as超出作用域后,这个临时内存的内容都可以被改变。

而在执行以上操作之前,这个临时内存都是有效的。

比如,代码a和代码b,是否绝对是稳定的??? 是否可以确定strcpy执行时,临时内存不会发生改变???
而代码c,有可能就是不稳定的????

代码a:
char *b=new char[1024];
AnsiString as="aaaaaaaaaaaaaaaaaaaaaaaaaaaa";
strcpy (b,as.c_str());
//。。。。。。代码部分
delete [b];


代码b:
AnsiString as="aaaaaaaaaaaaaaaaaaaaaaaaaaaa";
char *a=as.c_str();
char *b=new char[1024];
strcpy (b,a);
//。。。。。。代码部分
delete [b];



代码c:
AnsiString as="aaaaaaaaaaaaaaaaaaaaaaaaaaaa";
char *a=as.c_str();
as=as+"修改as的内容";
char *b=new char[1024];
strcpy (b,a);
//。。。。。。代码部分
delete [b];
cczlp 2006-07-06
  • 打赏
  • 举报
回复
代码
char *a=as.c_str();
的使用是错误的, a指向了临时内存
xiaoshi0 2006-07-06
  • 打赏
  • 举报
回复
1. 首先,那个*a是一个指向常量字符串的指针,不需要释放指针指向的空间,因为该空间不能被改写。

2. 没什么问题,动态生成的应该释放。

3. a和b也只是指针,他们所指向的空间都是由AnsiString类来分配的,当as超出了它的作用域,这个类的析构函数会负责释放它分配的变量,不用你关心。

你要知道,a和b只是指针,你的操作只是将指针指向了一块内存,你并没有为该指针分配空间,所以释放也不应该考虑。

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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