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" 它的存储空间为什么还是四个字节 实在搞不懂?
请大家帮帮我 谢谢好心人们
拜托 展开
5个回答
展开全部
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是动态内存分配的。就是一开始分配一定内存,如果不够的话再重新分配一次,重新分配的大小是原大小的两倍。
但绝对不是4字节。sizeof(s)是string指针所占内存大小,对于32位计算机,当然是4.。。
但绝对不是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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
内存分配方式可以看作有以下三种:
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配(heap),亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
C++中提供的string类以及new运算符分配动态内存都是属于第三种情况,分配动态内存的“按需分配”并不是像数组一样,数组要分配一块连续的地址空间,所以必须事先知道你要多大的地址空间,才能决定是否有那么大的空给你分配。这里所说的“按需”,就是你每增加一个元素,再自动给你增加一块空间,原理是通过动态链表,链表并不要求内存空间连续,只要由指针值把它们连接起来就行了。访问时,你得用指针去访问它,不能通过变量名访问,因为它是动态链表。
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配(heap),亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
C++中提供的string类以及new运算符分配动态内存都是属于第三种情况,分配动态内存的“按需分配”并不是像数组一样,数组要分配一块连续的地址空间,所以必须事先知道你要多大的地址空间,才能决定是否有那么大的空给你分配。这里所说的“按需”,就是你每增加一个元素,再自动给你增加一块空间,原理是通过动态链表,链表并不要求内存空间连续,只要由指针值把它们连接起来就行了。访问时,你得用指针去访问它,不能通过变量名访问,因为它是动态链表。
追问
new string(); 给string赋值的时候 在堆内存中是动态链表吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询