Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;内存分配方法 我刚开始C++,我不明白我的代码是如何工作的:_C++_Memory_Memory Management - Fatal编程技术网

c++;内存分配方法 我刚开始C++,我不明白我的代码是如何工作的:

c++;内存分配方法 我刚开始C++,我不明白我的代码是如何工作的:,c++,memory,memory-management,C++,Memory,Memory Management,好的,我分配内存,但是在分配时没有人知道要分配的内存的大小。但代码仍然有效。 分配了多少内存?编译器如何知道我需要多少内存 编辑: 对不起,我的问题不清楚。让我试着澄清一下。因此,我使用指针在堆中动态分配一些内存。但是由于sting变量中没有文本,我认为很难知道我将通过getline输入多少文本(字节) 我试着询问两个不同文本文字的大小,是的,它们的大小不同 sizeof("") // is 1 (because of the ending 0 maybe?) sizeof("sometext"

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

编辑:

对不起,我的问题不清楚。让我试着澄清一下。因此,我使用指针在堆中动态分配一些内存。但是由于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;
}
//编辑:
字符串a,b=“sometext”;

cout您似乎对
std::string
或任何动态容器如何处理其内存需求不是预先确定的这一事实感到困惑<例如,code>std::string
不在内部存储其字符数据。简单地说,它包含一个指针,指向另一个动态分配的缓冲区,该缓冲区包含实际数据
std::string
具有构造函数、析构函数和赋值运算符,可自动管理包含实际字符数据的额外缓冲区。这包括重新分配、复制数据、更新内部指针以及在需要额外存储时释放以前的缓冲区。包含实际数据的缓冲区的大小不计入
std::string
的大小,只有指向它的指针才起作用。
std::string
的每个实例在其整个生命周期中仅直接包含恒定数量的成员,这些成员的大小都是恒定的。在C++中,所有类型都有编译时常数大小。 有关显示其工作原理的
string
的简化实现,请参阅。本例中的类
rule\u of_five
的大小仅为
char*
的大小,而与该指针指向的缓冲区的内容无关。实际的缓冲区稍后在构建期间或之后分配,这是在对象本身的初始分配已经完成之后


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

是什么让您相信“没有人知道要分配的内存大小”?这很明显。需要为
musicCd
对象的一个实例提供足够的内存,它被分配,然后被释放。没有人知道要分配的内存大小不正确
musicCD
有一个固定的大小(使用
sizeof
查看它的大小)。我不相信标准会在意,但是musicCD的大小是由new决定的,可以通过一些标准操作来获得大小,例如,
sizeof(musicCD)
在旁注中,IDE不在乎分配多少内存。另一方面,编译器将执行以下操作。这并不是问题的主题,而是一个可能导致以后理解问题的错误。@op I我认为等式缺少的部分是sizeof(字符串)是常量。如果将内容添加到字符串,则新内容将在堆上管理。这意味着字符串s(“”)和字符串t(“ssjlskjskljlsj”)在堆栈上的大小相同;