2010-07-01 90 views
3

在一个程序中,我分配一个巨大的多维数组,做一些数字运算,然后只有该数组的第一部分更感兴趣,我想释放数组的一部分并继续处理数据在第一部分。我尝试使用realloc,但我不确定这是否是正确的方法,因为我必须保留数组中的数据,并且最好避免将该块复制到内存中。有没有办法只释放C/C++中的动态分配数组的一部分(收缩现有数组)?

#include <cstring> 
#include <cassert> 
#include <iostream> 

using namespace std; 

void FillArrayThenTruncate(char* my_array, const int old_size, int* new_size); 

int main() { 
    const int initial_size = 1024*1024*1024; 
    char* my_array = static_cast<char*>(malloc(initial_size)); 
    assert(my_array); 
    int new_size; 
    FillArrayThenTruncate(my_array, initial_size, &new_size); 
    for(int i = 0; i < new_size; ++i) cout << static_cast<int>(my_array[i]) << endl; 
} 

void FillArrayThenTruncate(char* my_array, const int old_size, int* new_size) { 
    //do something with my_array: 
    memset(my_array, 0, old_size); 
    for(int i = 0; i < 10; ++i) my_array[i] = i % 3; 
    //cut the initial array 
    *new_size = 10; 
    void* new_array = realloc(my_array, *new_size); 
    cout << "Old array pointer: " << static_cast<void*>(my_array) << endl; 
    cout << "New array pointer: " << new_array << endl; 
    my_array = static_cast<char*>(new_array); 
    assert(my_array != NULL); 
} 

UPDATE:
*请不要打扰建议使用STL。问题是关于C数组。
*感谢“R Samuel Klatchko”指出上述代码中的错误。

回答

2

是的,如果您使用malloc进行分配,则可以使用realloc调整大小。

这就是说,realloc可以移动你的记忆,所以你应该为此准备:

// Only valid when shrinking memory 
my_array = realloc(my_array, *new_size); 

请注意,如果你的成长记忆,上面的代码是危险的,因为realloc的可能会失败,并返回NULL哪种情况下你将失去你原来的指向my_array的指针。但对于缩小内存,它应该始终有效。

+0

感谢您的纠正 - 我太懒惰阅读功能描述和思想,realloc将修改my_array,而它恰巧会返回一个新值。 – 2010-07-01 12:05:54

+0

一般来说,这是否尝试将'my_array'放在同一位置? – alfC 2017-12-15 05:25:56

4

我假设你使用这个来学习......否则我建议你看看std :: vector和其他STL容器。

标题问题的答案是否定的。您必须压缩现有元素,或者您需要分配新空间并复制所需的数据。 realloc将从最后扩展/收缩或分配新空间并复制现有数据。

如果您正在处理如此庞大的数据集,那么您可能只需要一个块而不是一个整体集合。如果你只需要某些部分,也许不要把整个东西加载到内存中。

+0

+1用于暗示块的集合。如果您事先知道您要保存多少,这可能特别有用。然后,你可以有两个大块,当你完成它时就扔掉下半部分。您在访问单个元素时会稍微受到惩罚,以保证稍后不会有无关的分配/移动。 – 2010-07-01 13:47:20

3

对于C++,使用STL容器而不是手动处理内存。对于C,有realloc()

+1

考虑到他寻求帮助的具体问题,标准库中的任何内容都不能真正帮助开箱即用。矢量不缩小,只增长。 – 2010-07-01 13:49:43

+1

有一个简单的习惯用法,可以用来轻松缩小矢量。 http://stackoverflow.com/questions/586634/shrinking-a-vector/586682#586682 我同意这个答案。没有理由在C++中使用realloc。使用矢量。 – Dragontamer5788 2010-07-01 20:32:06

+0

@ Dragontamer5788,纠正我,如果我错了,但不会成语和“shrink_to_fit”在最好的情况下重新分配? (即将所有元素复制到新位置)。 – alfC 2017-12-15 05:24:23

相关问题