您的位置:首页 > 其它

最近在使用string类时出现了一个问题,string *p=(string *)malloc(sizeof(string)*10);

2014-10-08 16:10 411 查看
例子:

string *p=(string *)malloc(sizeof(string)*10);

*string str="tytyty";

*p=str;

free(p);

将此段代码放入控制台程序的main()中运行,结果发生如下错误:Unhandled exception at 0x5958ca08 (msvcr100d.dll) in stringtest.exe: 0xC0000005: Access violation writing location 0xcdcdcdcd.

竟然发生了“存取违规书写位置”的错误,在网上查询资料后得知,malloc()函数只是分配了10个string类型长度的内存,分配后这片内存中的值是随机的,没有被初始化的,一般使用memset()初始化此段内存,然后就可以给*p赋值了,修改以下代码:

string *p=(string *)malloc(sizeof(string)*10);

memset(p,0,sizeof(string));

*string str="tytyty";

*p=str;

cout<<*p<<endl;.

free(p);

结果输出为:"tytyty"。其实用malloc()给string分配内存是不好的,稍微不注意就会导致内存泄露!要知道string是c++ stl中的类,如果要为string进行内存分配的动作,最好使用new和delete的组合,这样又快又省事!

所以说开头我使用malloc()为string类型的指针分配内存就是自找麻烦!实际上当使用malloc()为C的基本类型分配内存时,能很好地工作,也不存在必须要使用memset()为malloc()分配的int类型的内存区初始化,直接赋值就可以了。

刚才又想了下,这个问题的关键是string *p=(string *)malloc(sizeof(string)*10);这句,只是说明p指向了一个可以容纳10个string类型的内存空间,这里面的值是随机的,不确定的,这和直接定义一个string对象不同,例如:string pp;这个系统自动为pp分配了一个string大小的内存,并且pp的初始值为"",然后我们才可以直接赋值给pp,反过来说,如果过pp的值如果像malloc()分配的string块的值一样,那么pp也不可以直接赋值,因个人能力有限不知道个中原因,但是起码也看到了这个表象。

个人认为可以使用malloc()函数为C的基本类型分配内存,这个没有问题,如果用要为C++类型、包含有C++类型的结构体或者类分配内存,最好使用new分配,记得使用delete删除。虽然花大量时间思考了这个可以避免的问题,但是在过程中,我对C/C++的内存分配机制有了更深一层的认识。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐