
C++ string内存的分配 C++如何给string分配内存的 希望各位帮帮忙
#include<string>#include<iostream>#include<vector>usingnamespacestd;intmain(){string*...
#include<string>
#include<iostream>
#include<vector>
using namespace std;
int main() {
string *s = new string(); //为什么一开始就给string 开辟 4个内存?
cout << sizeof(s) << endl;
cout << sizeof(*s) << endl;
*s="sdfsdfsdffsfd";
cout << sizeof(*s) << endl; //为什么给它重新赋值之后 它的大小仍然是四个字节呢?
cout << *s << endl;
system("pause");
return 0;
}
我刚调用new运算符的时候 为什么就给 (*s) 分配了四个字节的内存?
当我给他赋值的时候,"sdfsdfsdffsfd" 它的存储空间为什么还是四个字节 实在搞不懂?
请大家帮帮我 谢谢好心人们 展开
#include<iostream>
#include<vector>
using namespace std;
int main() {
string *s = new string(); //为什么一开始就给string 开辟 4个内存?
cout << sizeof(s) << endl;
cout << sizeof(*s) << endl;
*s="sdfsdfsdffsfd";
cout << sizeof(*s) << endl; //为什么给它重新赋值之后 它的大小仍然是四个字节呢?
cout << *s << endl;
system("pause");
return 0;
}
我刚调用new运算符的时候 为什么就给 (*s) 分配了四个字节的内存?
当我给他赋值的时候,"sdfsdfsdffsfd" 它的存储空间为什么还是四个字节 实在搞不懂?
请大家帮帮我 谢谢好心人们 展开
4个回答
展开全部
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的,但是有点这个类似的意思。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
额。。你这个string貌似是C++提供的string类和标准C字符串是不同的。
S是一个指针,长度肯定是4。。这个不用解释了吧
S的值是一个STRING类。。长度肯定计算出来是string类的长度。。32。。具体string类请参阅相关源文件。
S是一个指针,长度肯定是4。。这个不用解释了吧
S的值是一个STRING类。。长度肯定计算出来是string类的长度。。32。。具体string类请参阅相关源文件。
更多追问追答
追问
s是个指针长度是4 这我知道
可是 cout << sizeof(*s); 结果也是4 啊
追答
我算出来是32。。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
String s = new String(
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
内存分配方式可以看作有以下三种:
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配(heap),亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
C++中提供的string类以及new运算符分配动态内存都是属于第三种情况,分配动态内存的“按需分配”并不是像数组一样,数组要分配一块连续的地址空间,所以必须事先知道你要多大的地址空间,才能决定是否有那么大的空给你分配。这里所说的“按需”,就是你每增加一个元素,再自动给你增加一块空间,原理是通过动态链表,链表并不要求内存空间连续,只要由指针值把它们连接起来就行了。访问时,你得用指针去访问它,不能通过变量名访问,因为它是动态链表。
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配(heap),亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
C++中提供的string类以及new运算符分配动态内存都是属于第三种情况,分配动态内存的“按需分配”并不是像数组一样,数组要分配一块连续的地址空间,所以必须事先知道你要多大的地址空间,才能决定是否有那么大的空给你分配。这里所说的“按需”,就是你每增加一个元素,再自动给你增加一块空间,原理是通过动态链表,链表并不要求内存空间连续,只要由指针值把它们连接起来就行了。访问时,你得用指针去访问它,不能通过变量名访问,因为它是动态链表。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询