Ant*_*yko 3 c++ memory-management
在一个程序中,我分配一个巨大的多维数组,进行一些数字运算,然后只有该数组的第一部分是进一步感兴趣的,我想释放数组的一部分并继续处理数组中的数据第一部分。我尝试使用 realloc,但我不确定这是否是正确的方法,因为我必须保留数组中的数据,并且最好避免在内存中复制该块。
#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);
}
Run Code Online (Sandbox Code Playgroud)
更新:
* 请不要费心建议使用STL。问题是关于C数组的。
* 感谢“R Samuel Klatchko”指出上面代码中的错误。
我假设您正在使用它来学习...否则我建议您研究 std::vector 和其他 STL 容器。
标题问题的答案是否定的。您必须压缩现有元素,或者需要分配新空间并复制所需的数据。realloc将从末尾扩展/收缩或分配新空间并复制现有数据。
如果您正在处理如此大的数据集,您可能只拥有一个块的集合而不是一个整体集。如果你只需要某些部分,也许一开始就避免将整个东西加载到内存中。
| 归档时间: |
|
| 查看次数: |
1860 次 |
| 最近记录: |