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" 它的存储空间为什么还是四个字节 实在搞不懂?
请大家帮帮我 谢谢好心人们
拜托
展开
 我来答
ace_fei
推荐于2018-03-20 · TA获得超过2013个赞
知道小有建树答主
回答量:734
采纳率:100%
帮助的人:722万
展开全部
首先你要弄清楚sizeof是用来求类型的字节数的。
因为你定义的string *s是string的对象指针,那么sizeof(*s) 和 sizeof(s) 都是求指针类型的字节数,学过数据结构的你应该知道指针是一个很重要的概念,它记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4。
而你赋值后改变长度的是strlen。
百度网友3ad5602
2011-06-24 · TA获得超过717个赞
知道小有建树答主
回答量:345
采纳率:100%
帮助的人:357万
展开全部
string在各个库中的实现不同,vc中它的sizeof是4,不会随着字符串内容的变化而变化的
举个例子
struct A
{
char* p;
};
它的sizeof就是4,A a;a.p = new[10000];sizeof(a)还是4,虽然string不是这么实现的,是基于allocator的,但是有点这个类似的意思。
追问
不理解  郁闷中
追答
多看书,多实践,慢慢就理解了
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chichujn
2011-06-24 · TA获得超过663个赞
知道小有建树答主
回答量:1534
采纳率:50%
帮助的人:1102万
展开全部
类string是动态内存分配的。就是一开始分配一定内存,如果不够的话再重新分配一次,重新分配的大小是原大小的两倍。
但绝对不是4字节。sizeof(s)是string指针所占内存大小,对于32位计算机,当然是4.。。
追问
但是 当我用sizeof(*s) 的时候 还是输出4啊
cout << sizeof(*s) <<endl; 刚开始输出4
后来 (*s)="sdfsdfsdf";
cout << sizeof(*s) <<endl;还是输出4

拜托了!!
追答
没看string的源代码,可能和成员有关。可能如下
#include

using namespace std;

class String
{
public:
char* str;
String():str(0){}
~String(){delete str;}
void assign(const char* s, unsigned int size)
{
str = new char[size];
memcpy(str, s, size);
}
};

int main()
{
String s;
cout<<sizeof(s)<<endl;
const char* t = "just a test";
s.assign(t, 12);
cout<<sizeof(s)<<endl;
system("pause");
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
黔含品2
2017-01-11 · TA获得超过3.8万个赞
知道小有建树答主
回答量:2.7万
采纳率:45%
帮助的人:1393万
展开全部
s自身的内存 在结束后 会直接释放

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

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

strdup是C的
需要
char *p=strdup(a);
使用后, 需要 free(p);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
少有人教的那些事
2011-06-24 · TA获得超过8452个赞
知道大有可为答主
回答量:1.1万
采纳率:50%
帮助的人:2100万
展开全部
内存分配方式可以看作有以下三种:
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配(heap),亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
C++中提供的string类以及new运算符分配动态内存都是属于第三种情况,分配动态内存的“按需分配”并不是像数组一样,数组要分配一块连续的地址空间,所以必须事先知道你要多大的地址空间,才能决定是否有那么大的空给你分配。这里所说的“按需”,就是你每增加一个元素,再自动给你增加一块空间,原理是通过动态链表,链表并不要求内存空间连续,只要由指针值把它们连接起来就行了。访问时,你得用指针去访问它,不能通过变量名访问,因为它是动态链表。
追问
new string(); 给string赋值的时候  在堆内存中是动态链表吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式