【问题标题】:Is dynamic memory deletion also possible in arrays?数组中也可以动态删除内存吗?
【发布时间】:2014-03-20 08:48:49
【问题描述】:

假设我已经声明了一个字符数组并从用户那里获取一个字符串,如下所示:

char s[100000];
std::cin>>s;

现在假设用户输入了字符串"Program"。我的字符数组如下:

'P''r''o''g''r''a''m''\0'......(99992 remaining indices with no/junk values)

有没有办法释放那些 99992 个索引占用的空间?同样,如果我有一个大小为 100000 的整数数组,并且在运行时只使用前 10 个索引,有没有办法在程序运行时调整数组的大小。我知道我们可以为此目的使用向量,但是使用数组可以以某种方式实现吗?对于整数数组,我知道我们可以动态声明数组,然后根据我们的要求声明大小,但是说我有 10 个整数的数组,如下所示:

1 2 3 4 5 6 7 8 9 10

现在,我只想使用前 9 个索引和 wnat 来删除第 10 个索引。也就是说,除了动态分配,数组也可以动态删除吗?

编辑: 我知道使用 STL 可以做到这一点,但我想知道我们是否可以在数组中做同样的事情?

【问题讨论】:

  • 是的,你可以。它叫做std::string
  • 由于您使用的是C++,因此请改用vector<int>string
  • 不!我知道使用 STL 可以做到这一点,但我想知道我们是否可以在数组中做同样的事情?
  • 您可能想查看realloc()

标签: c++ arrays memory-management


【解决方案1】:

没有。

如果您定义了固定大小的数组,则无法在运行时释放部分数组。使用某种动态分配的数组——可能是 stringvector<int> 分别用于您的两个示例数组,尽管 vector<char> 也可能对您来说足够好。

【讨论】:

  • 在向量中也是如此,我认为我们不能通过删除它们之间的索引来删除和释放空间。例如我有 1 0 0 0 ......(1000 次) 1 并且两个 1 之间的所有 1000 个零都是无用的,所以我无法释放这 1000 个零占用的空间,因为调整大小功能会缩小向量从后面删除,因此在最后一个位置删除 1。
  • 不——你不能轻易删除向量的中间部分,但有办法将不需要的中间部分移到末尾(并将想要的一端向前),然后你可以缩小结果。 OTOH,这似乎不是你要问的。您的问题只讨论了从最后删除。
【解决方案2】:

当你写作时:

char s[100000];

您告诉编译器在程序堆栈中堆栈 100000 个字节。 但是,当您动态保留内存时:

char * = new char[100000];

您要求系统在堆中保留 100000 个字节,以便您可以根据需要处理请求的内存,甚至告诉系统将其作为资源释放。

在本地上下文完成之前,您不能释放堆栈中的内存。例如,退出您声明 char s[100000] 的函数。

检查这个问题: What and where are the stack and heap?

std::string 是在堆上使用动态内存分配实现的,这就是为什么它允许您减小其大小。

【讨论】:

    【解决方案3】:

    这是不可能的。

    您可以将您的用户输入捕获包装在一个子例程中,该子例程分配堆栈空间并以实际需要的长度分配堆内存。

    【讨论】:

      【解决方案4】:

      您对何时使用静态分配以及何时使用动态分配感到困惑。

      • 在编译时预先知道最大项目数时使用静态分配。
      • 当项目数在运行时之前未知时,使用动态分配。

      除了上述两种情况外,没有其他情况。你不能混合它们,这样做没有意义。

      您应该分配一个静态数组 char s[100000]; 的唯一情况是您知道,在某个时候,程序需要处理 100000 个项目。

      您将程序设计为处理 100000 个项目的最坏情况。它必须仍然能够处理那么多。如果程序需要一个变量数组,大小未知,你应该使用动态分配。

      如果我们忽略 C++ 的存在,那么你会在 C 中做的是:

      char* s = malloc(sizeof(*s) * 100000);
      ...
      s = realloc(s, some_strlenght);
      

      请注意,在许多操作系统中分配在堆栈上的巨大静态数组是不好的做法。所以你可能不得不在堆上声明 100000 数组,即使你不会调整它的大小。仅仅是因为您的进程中可能没有足够的堆栈空间来声明像这样的大而笨重的变量。

      (另外,由于 C++ 的设计方式,std::string 和 std::vector 等总是在内部使用动态内存实现,即使您只使用它们的固定大小也是如此。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-26
        • 1970-01-01
        相关资源
        最近更新 更多