数组中是否也可以删除动态内存?

时间:2014-03-20 08:48:50

标签: c++ arrays memory-management

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

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,但我想知道我们是否可以在数组中做同样的事情?

4 个答案:

答案 0 :(得分:6)

没有

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

答案 1 :(得分:1)

当你写:

char s[100000];

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

char * = new char[100000];

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

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

的函数

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

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

答案 2 :(得分:0)

这是不可能的。

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

答案 3 :(得分:0)

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

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

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

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

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

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

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

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

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