最近在使用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++的内存分配机制有了更深一层的认识。
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++的内存分配机制有了更深一层的认识。
相关文章推荐
- 深入springMVC------文件上传源码解析(上篇) 最近在项目中,使用springmvc 进行上传文件时,出现了一个问题: org.springframework.web.multipart
- 最近开发一个项目使用了Nhibernate出现了如下问题deleted object would be re-saved by cascade (remove deleted object from
- 最近使用ajaxFileUpload和Jcrop来实现图片上传和截图,出现一个图片无法更换的问题
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题
- 使用网络目录映射虚拟目录出现 500.19 权限不足问题的一个解决办法
- Matlab优化工具箱(optimization toolbox)使用时出现的一个问题
- 练习2-4:编一个程序统计文件中特定单词出现的次数(要求使用string类的运算符==来查找单词)
- 在使用Oracle9Ii时出现的一个问题~~
- eclipse使用中出现的一个问题
- 使用 ajax toolkit 中的 tabcontrol 时出现的一个小问题
- 最近在使用sps类库过程中发现了一个让我比较疑惑的问题(有关items属性的)
- 一个链表在使用时出现内存错误的问题
- 在最近做一个高级查询时遇见的问题,javascript在动态的form里使用会出现问题
- openfire使用LDAP中出现的一个问题
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题(非原创,摘自书中)
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题
- 执行SQL语句时出现问题操作必须使用一个可更新的查询错误的解决方法
- 网络上最近出现的一个怪问题
- 最近维护的一个系统出现了一个很诡异的备份问题。
- 使用VS2008编排文档中出现的一个小问题