永发信息网

C++ string内存的分配 C++如何给string分配内存的

答案:5  悬赏:60  手机版
解决时间 2021-11-07 13:17
C++ string内存的分配 C++如何给string分配内存的
最佳答案
首先你要弄清楚sizeof是用来求类型的字节数的。
因为你定义的string *s是string的对象指针,那么sizeof(*s) 和 sizeof(s) 都是求指针类型的字节数,学过数据结构的你应该知道指针是一个很重要的概念,它记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4。
而你赋值后改变长度的是strlen。
全部回答
s自身的内存 在结束后 会直接释放

问题是strdup开辟内存 这样做是没法释放的。
C++和C尽量不要混用。

其实 用string s=是没必要用strdup的
比如 存在char a[]="test"
要生成新的 直接string s=a;
这样就可以了。

strdup是C的
需要
char *p=strdup(a);
使用后, 需要 free(p);
内存分配方式可以看作有以下三种:
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配(heap),亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
C++中提供的string类以及new运算符分配动态内存都是属于第三种情况,分配动态内存的“按需分配”并不是像数组一样,数组要分配一块连续的地址空间,所以必须事先知道你要多大的地址空间,才能决定是否有那么大的空给你分配。这里所说的“按需”,就是你每增加一个元素,再自动给你增加一块空间,原理是通过动态链表,链表并不要求内存空间连续,只要由指针值把它们连接起来就行了。访问时,你得用指针去访问它,不能通过变量名访问,因为它是动态链表。
追问new string(); 给string赋值的时候 在堆内存中是动态链表吗?
string在各个库中的实现不同,vc中它的sizeof是4,不会随着字符串内容的变化而变化的
举个例子
struct A
{
char* p;
};
它的sizeof就是4,A a;a.p = new[10000];sizeof(a)还是4,虽然string不是这么实现的,是基于allocator的,但是有点这个类似的意思。追问不理解 郁闷中追答多看书,多实践,慢慢就理解了
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
体能训练可以减肥塑形吗
85 65 90身材怎么样???
就因为摸了女友的胸口,她就让我两个星期别见
六道骸的第六道有什么能力
三国演义中有哪三绝?
为什么称卡特为“半人半神”?
photoshop自定义画笔如何导出笔刷文件啊?
WOW什么是水库潜行队啊?水库三副本都可以潜
省呗运动红包提现页面显示notenough
喜德盛的自行车怎么样?除了售后点不如G和M的
诺基亚n8是双卡双待的吗
在你最窘迫,最穷困潦倒的时候。爱情和生活都
LOL“先手”的英语?
电脑能用来干什么,除了玩游戏电脑还能干什么
请问长沙西站到湘潭西站有多少公里路?
推荐资讯
除了AMD和intel这两种CPU还曾经存在过其他的C
荥经县疾控中心地址在什么地方,想过去办事
深圳银湖公交398路线
第一排是EC61. 第二排是32D5,请问一下这
英雄联盟超凡大师每天打的胜点会清零?
官渡区第一考场摩托车科目二考场地址在哪,我
浮天水送无穷树 带雨云埋一半山 蕴含了什么样
我家卫生间用布和水泥做的防水,干了有鼓包,有
筛管内有哪些结构特征以适应其运输功能
白沙铺村地址在什么地方,我要处理点事!
北京军浩鸿达科技有限公司怎么样?
大气式燃烧器与强制鼓风式区别
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?