【问题标题】:What exactly is dynamic memory? [duplicate]究竟什么是动态内存? [复制]
【发布时间】:2012-04-30 23:14:27
【问题描述】:

可能重复:
Differences between dynamic memory and “ordinary” memory

我正在阅读 C++ 教程,但我不明白为什么我需要声明动态内存,教程是这样说的:

到目前为止,在我们所有的程序中,我们只有为变量声明的可用内存,所有变量的大小在程序执行之前在源代码中确定。

然后它说我们必须使用 new 和 delete 运算符来使用动态内存。 但是,我似乎在声明指针时使用了动态内存,例如char* p,我没有指定字符数组的长度。事实上,我认为当你使用指针时,你总是在使用动态内存。这不是真的吗? 我只是看不出使用 new 运算符声明变量与不声明变量之间的区别。我真的不明白什么是动态内存。谁能给我解释一下?

【问题讨论】:

标签: c++


【解决方案1】:

我认为当你使用指针时,你总是在使用动态 记忆。是不是真的?

不,这不是真的,例如

int i;
int *p = &i; // uses a pointer to static memory, no dynamic memory.

但是,我在声明指针时似乎使用了动态内存, 例如char* p,我没有指定数组的长度 字符数

char[100] string;
char* p = &(string[0]);  // Same as above, no dynamic memory.

当您无法判断数据结构需要多大时,您需要动态内存。

假设您要从文件中读取一些整数并将它们存储在内存中。你不知道你需要多少个整数。你可以选择一个 100 的数字,但是如果有 101,那么你的程序就会中断。你可以选择 100,000,希望这已经足够了,但是如果文件中只有 10,那么它会浪费资源,同样,如果文件中有 100,001 个整数,它就会中断文件。

在这种情况下,您的程序可以遍历文件,计算整数的数量,然后动态地创建一个正确大小的数组。然后你再次传递文件,将整数读取到新数组中。

静态 v 的动态内存
静态内存是静态的,因为一旦程序编译它就无法更改,它是静态的。您在函数中声明的变量以及在类/结构上声明的成员是静态的。当每个方法被调用时,编译器会准确计算需要多少个。
动态内存是一个内存“池”,可以在运行时按需供您的程序使用。 编译器只知道它需要分配一些(可能未知的)内存量,并将该内存释放回动态内存池。

希望这会有所帮助。

附注是的,有更有效的方法可以将未知数量的项目放入内存,但这是最简单的解释

【讨论】:

    【解决方案2】:

    当你有:

    char* p;
    

    p 是指向 char 类型指针的变量,p 存储在堆栈中,您还没有分配任何动态内存。

    但是当你这样做时:

    p = new char[100];
    

    您已分配了一部分大小为 100*sizeof(char) 的动态内存(堆)。

    您负责释放堆上分配的内存:

    delete[] p;
    

    您不需要从堆栈中清除变量 - 它们会在变量超出范围后自动删除。在此示例中,p 将在超出其范围时从堆栈中删除。

    【讨论】:

      【解决方案3】:

      动态内存是程序员必须明确请求的内存,而不是在堆栈上自动分配。

      动态内存有很多优点,例如在堆栈帧(函数调用)之间保持持久性,并且可以具有不同的大小。

      在堆栈上,数组具有一定的大小:

      int ar[5];
      

      但是如果你有 10 个元素那么你就做不到,解决方案是动态分配内存;

      size_t sz;
      std::cin >> sz;
      int *i_p=new int[sz];
      

      也就是说,所有动态分配的东西都必须被释放(在 C++ 中使用删除)

      delete i_p;
      

      但是,在可能的情况下,通常最好对动态数组使用包装器,例如 std::vector

      size_t sz;
      std::cin >> sz;
      std::vector<int> vect(sz);
      

      这将自动管理内存并为数组提供有用的接口。

      【讨论】:

        【解决方案4】:

        假设您想从用户那里读取未知数量的整数。例如,您可以声明 int numbers[100],询问用户有多少个数字(假设这是存储在变量 n 中),如果他输入的数字大于 100,您别无选择,只能报告错误。或者,您可以写 int *numbers = new int[n] 并为所有数字分配足够的空间。

        【讨论】:

          【解决方案5】:

          c++中的动态内存是使用new操作符在操作系统堆中分配的内存。当您需要分配太大而无法在堆栈中分配的对象时,或者当您有一个多线程环境并且需要在不同线程之间共享在其中一个线程中分配的内存时,您需要动态内存。指针并不意味着你使用动态内存指针也可以包含堆栈中与对象相关的堆栈地址。

          【讨论】:

            【解决方案6】:

            事实上,我认为当你使用指针时,你总是在使用动态内存。是不是真的?

            没有。这是一个指向堆栈分配(“自动”)内存的指针:

            {
                int i;
                int *p = &i;
            }
            

            【讨论】:

              猜你喜欢
              • 2015-10-31
              • 2020-02-26
              • 2011-03-03
              • 2014-03-11
              • 2019-08-28
              • 2012-03-18
              • 2014-11-01
              • 2017-01-12
              • 1970-01-01
              相关资源
              最近更新 更多