C++ string内存的分配 C++如何给string分配内存的
答案:5 悬赏:60 手机版
解决时间 2021-11-07 13:17
- 提问者网友:暮烟疏雨之际
- 2021-11-06 13:18
C++ string内存的分配 C++如何给string分配内存的
最佳答案
- 五星知识达人网友:蓝房子
- 2021-11-06 14:49
首先你要弄清楚sizeof是用来求类型的字节数的。
因为你定义的string *s是string的对象指针,那么sizeof(*s) 和 sizeof(s) 都是求指针类型的字节数,学过数据结构的你应该知道指针是一个很重要的概念,它记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4。
而你赋值后改变长度的是strlen。
因为你定义的string *s是string的对象指针,那么sizeof(*s) 和 sizeof(s) 都是求指针类型的字节数,学过数据结构的你应该知道指针是一个很重要的概念,它记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4。
而你赋值后改变长度的是strlen。
全部回答
- 1楼网友:荒野風
- 2021-11-06 16:13
s自身的内存 在结束后 会直接释放
问题是strdup开辟内存 这样做是没法释放的。
C++和C尽量不要混用。
其实 用string s=是没必要用strdup的
比如 存在char a[]="test"
要生成新的 直接string s=a;
这样就可以了。
strdup是C的
需要
char *p=strdup(a);
使用后, 需要 free(p);
问题是strdup开辟内存 这样做是没法释放的。
C++和C尽量不要混用。
其实 用string s=是没必要用strdup的
比如 存在char a[]="test"
要生成新的 直接string s=a;
这样就可以了。
strdup是C的
需要
char *p=strdup(a);
使用后, 需要 free(p);
- 2楼网友:玩家
- 2021-11-06 15:15
内存分配方式可以看作有以下三种:
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配(heap),亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
C++中提供的string类以及new运算符分配动态内存都是属于第三种情况,分配动态内存的“按需分配”并不是像数组一样,数组要分配一块连续的地址空间,所以必须事先知道你要多大的地址空间,才能决定是否有那么大的空给你分配。这里所说的“按需”,就是你每增加一个元素,再自动给你增加一块空间,原理是通过动态链表,链表并不要求内存空间连续,只要由指针值把它们连接起来就行了。访问时,你得用指针去访问它,不能通过变量名访问,因为它是动态链表。
追问new string(); 给string赋值的时候 在堆内存中是动态链表吗?
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配(heap),亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
C++中提供的string类以及new运算符分配动态内存都是属于第三种情况,分配动态内存的“按需分配”并不是像数组一样,数组要分配一块连续的地址空间,所以必须事先知道你要多大的地址空间,才能决定是否有那么大的空给你分配。这里所说的“按需”,就是你每增加一个元素,再自动给你增加一块空间,原理是通过动态链表,链表并不要求内存空间连续,只要由指针值把它们连接起来就行了。访问时,你得用指针去访问它,不能通过变量名访问,因为它是动态链表。
追问new string(); 给string赋值的时候 在堆内存中是动态链表吗?
- 3楼网友:纵马山川剑自提
- 2021-11-06 14:58
string在各个库中的实现不同,vc中它的sizeof是4,不会随着字符串内容的变化而变化的
举个例子
struct A
{
char* p;
};
它的sizeof就是4,A a;a.p = new[10000];sizeof(a)还是4,虽然string不是这么实现的,是基于allocator的,但是有点这个类似的意思。追问不理解 郁闷中追答多看书,多实践,慢慢就理解了
举个例子
struct A
{
char* p;
};
它的sizeof就是4,A a;a.p = new[10000];sizeof(a)还是4,虽然string不是这么实现的,是基于allocator的,但是有点这个类似的意思。追问不理解 郁闷中追答多看书,多实践,慢慢就理解了
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯