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

发布网友 发布时间:2022-04-22 03:51

我来回答

5个回答

热心网友 时间:2023-10-18 02:51

首先你要弄清楚sizeof是用来求类型的字节数的。
因为你定义的string *s是string的对象指针,那么sizeof(*s) 和 sizeof(s) 都是求指针类型的字节数,学过数据结构的你应该知道指针是一个很重要的概念,它记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4。
而你赋值后改变长度的是strlen。

热心网友 时间:2023-10-18 02:51

string在各个库中的实现不同,vc中它的sizeof是4,不会随着字符串内容的变化而变化的
举个例子
struct A
{
char* p;
};
它的sizeof就是4,A a;a.p = new[10000];sizeof(a)还是4,虽然string不是这么实现的,是基于allocator的,但是有点这个类似的意思。追问不理解 郁闷中

追答多看书,多实践,慢慢就理解了

热心网友 时间:2023-10-18 02:52

类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;
}

热心网友 时间:2023-10-18 02:52

s自身的内存 在结束后 会直接释放

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

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

strp是C的
需要
char *p=strp(a);
使用后, 需要 free(p);

热心网友 时间:2023-10-18 02:53

内存分配方式可以看作有以下三种:
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配(heap),亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
C++中提供的string类以及new运算符分配动态内存都是属于第三种情况,分配动态内存的“按需分配”并不是像数组一样,数组要分配一块连续的地址空间,所以必须事先知道你要多大的地址空间,才能决定是否有那么大的空给你分配。这里所说的“按需”,就是你每增加一个元素,再自动给你增加一块空间,原理是通过动态链表,链表并不要求内存空间连续,只要由指针值把它们连接起来就行了。访问时,你得用指针去访问它,不能通过变量名访问,因为它是动态链表。
追问new string(); 给string赋值的时候 在堆内存中是动态链表吗?

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com