gpt4 book ai didi

C++ 内存分配 howto

转载 作者:行者123 更新时间:2023-11-30 03:34:43 24 4
gpt4 key购买 nike

我刚开始使用 C++,我无法理解我的代码是如何工作的:

好的,我分配内存,但在分配时没有人知道要分配的内存大小。但代码仍然有效。分配了多少内存?编译器如何知道我需要多少内存?

编辑:

抱歉,如果我的问题不清楚。让我试着澄清一下。所以我使用我的指针在堆中动态分配一些内存。但是由于 sting 变量中没有文本,我认为很难知道我将通过 getline 输入多少文本(字节)。

我试着询问两个不同文本文字的大小,是的,它们的大小不同。

sizeof("") // is 1 (because of the ending 0 maybe?)
sizeof("sometext") // is 9

但是对于字符串:sizeof 两次都给了我 4。很明显,sizeof() 给出了指向字符串的指针的长度。

如何分配内存?如果我为一个新的字符串分配内存,只分配给一个指向字符串中第一个字符的内存地址的指针?显然我输入的字符必须存储在某个地方。我首先分配内存,然后将一些文本加载到其中。

编辑 2:使编辑后的代码看起来像代码,而不是纯文本。

//Edit:    
string a,b = "sometext";
cout << sizeof(a) << endl; //4
cout << sizeof(b); //4

//--------------------------------------------------------

#include <iostream>
#include <string>
#include <exception>



using namespace std;

int main()
{
//Defining struct
struct musicCD
{
string artist, title; // artist of the CD
};
//Memory allocation
musicCD *ptr;
try{ptr = new musicCD;}
catch(bad_alloc){cerr << "Out of memory :(";return -1;}
catch(...){cerr << "Something bad happened :O !";return -1;
}

//Get the data to store:
cout << "Please enter the data for the CD!' " << endl;
cout << "Please enter the artist: ";getline(cin, ptr->artist); cout << endl;
//Write out the data
cout << "The data entered: " << endl;
cout << "The artist performing is: \t" << ptr->artist << endl;

delete ptr;
return 0;
}

最佳答案

您似乎对 std::string 或任何动态容器如何处理内存需求未预先确定这一事实感到困惑。例如,std::string 在内部存储它的字符数据。简单地说,它包含一个指针,该指针指向包含实际数据的另一个 动态分配的缓冲区。 std::string 具有构造函数、析构函数和自动管理额外缓冲区的赋值运算符,其中包含实际的字符数据。这包括重新分配、复制数据、更新内部指针以及在需要额外存储时释放先前的缓冲区。包含实际数据的缓冲区大小计入std::string 的大小,只有指向它的指针计入。 std::string 的每个实例,在其整个生命周期中,只直接包含固定数量的成员,这些成员的大小都是固定的。在 C++ 中,所有类型都有一个编译时常量大小。

参见 Rule of five用于显示其工作原理的 string 的简化实现。此示例中类 rule_of_five 的大小只是 char* 的大小,而不管此指针指向的缓冲区的内容如何。实际缓冲区稍后分配,在构造期间或构造之后,即在对象本身的初始分配已经完成之后。

编辑:在某些情况下,当处理非常短的字符串时,字符串可以在内部存储它的字符数据。这是其他容器中不常见的优化。参见 this answer .

关于C++ 内存分配 howto,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41856906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com