+ -
当前位置:首页 → 问答吧 → 请教关于 char *和AnsiString的转换

请教关于 char *和AnsiString的转换

时间:2011-11-28

来源:互联网

对于 AnsiString转换为char *,我知道2种方法,我想知道第二种方法会否没这么安全,因为缺乏了初始化,如果是安全的,我倾向于第二种,因为少了1行代码

(1)  
AnsiString s="abcde";  
char * buf = new char[s.Length()+1];  
memset(buf,s.Length()+1);  
strcpy(buf,s.c_str();  

(2)
AnsiString str;  
char *xx=new char[str.Length()+1];  
memcpy(xx,str.c_str());  

作者: marklr   发布时间: 2011-11-28

安全是安全,不会有内存泄露,初始化后全0,不初始化也不影响赋值。
可以了,记得最后delete 就可以。

作者: ksrsoft   发布时间: 2011-11-28

奇怪了,长度我没有使用 s.Length()+1,怎么依然是能够正确显示结果 abcde,难道这个时候已经发生内存泄露?

C/C++ code

    AnsiString s="abcde";
    char * buf=new char[s.Length()];
    memset(buf,0,s.Length());
    strcpy(buf,s.c_str());

    ShowMessage(buf);

    delete []buf;
    buf=NULL;


作者: marklr   发布时间: 2011-11-28

第一条的memset是否可以去掉呢?
呵呵我基础不好,以为在new出buf后已经是声明了内存空间了,为什么还要用memset呢?
程序末尾是不是还得delete下释放内存呢?

作者: sxqinge   发布时间: 2011-11-28

引用 2 楼 marklr 的回复:

奇怪了,长度我没有使用 s.Length()+1,怎么依然是能够正确显示结果 abcde,难道这个时候已经发生内存泄露?

C/C++ code

AnsiString s="abcde";
char * buf=new char[s.Length()];
memset(buf,0,s.Length());
strcpy(buf,s.c_str());

……
不是内存泄漏,而是内存访问越界。

作者: cgl_lgs   发布时间: 2011-11-28

引用 2 楼 marklr 的回复:

奇怪了,长度我没有使用 s.Length()+1,怎么依然是能够正确显示结果 abcde,难道这个时候已经发生内存泄露?

C/C++ code

AnsiString s="abcde";
char * buf=new char[s.Length()];
memset(buf,0,s.Length());
strcpy(buf,s.c_str());

……


应该会抛错的,BCB的异常机制还是做得不够啊。。

作者: getline   发布时间: 2011-11-28

怎么一定得抛错呢?我没看出来。

作者: cgl_lgs   发布时间: 2011-11-28