我正在尝试模拟使用push_back时矢量容器的行为。我创建了一个指针数组。每个元素可以有不同的长度,所以我需要在每次存储新元素时重新分配:
void *reallocf(void *p, size_t s)
{
void *tmp = realloc(p, s);
if(tmp) return tmp;
free(p);
return NULL;
}
int main(){
int rows = 9000;
int cols = 23000;
int *matrix = (int*)malloc(sizeof(int)*rows*cols);
//counter of elements
int *nums = new int [rows];
memset(num, 0, sizeof(int)*rows)
/* populate matrix*/
....
int **Xcc = new int *[rows];
for(i = 0; i < rows; i++){
for(k = 0; k < cols; k++){
if(matrix[i*cols +k] == 0){
Xcc[i] = (int*) reallocf(Xcc[i], sizeof(int)*(num[i]+1));
Xcc[i][num[i]] = k;
num[i]++;
}
}
}
}
基本上我正在做的是存储一个元素的位置,即 0。因此,数组Xcc[i]
每次需要时都会增加一个元素。新的长度将是前一个加 1,将被存储。
显然对我来说似乎很好,但是这取决于我正在segmentation faults
的东西,在从许多不同的角度看它之后,我目前陷入了困境。任何帮助都会很棒,想法或建议。
问题可能是这样的:当你这样做时
int **Xcc = new int *[rows];
Xcc[i],对于泛型i,没有初始化,那么对realloc()的调用有时可能有效(如果Xcc[i]为空),有时可能不工作(段错误)。
您缺少:
memset(Xcc, 0, sizeof(int*) * rows);
您不需要通过 realloc
显式free
重新分配的指针。 realloc
释放传递给它的指针(如果不是NULL
)。
因此,请从reallocf()
函数中删除free(p);
。
正如@Joachim Pileborg指出的那样,您无法重新分配分配的内存new
。所以把new
改成malloc
.
if(matrix[i*cols +k] == 0){
Xcc[i] = (int*) reallocf(Xcc[i], sizeof(int)*(num[i]+1));
Xcc[i][num[i]] = k; // bad access here
首先,您根据可能对 k
或 j
的多个值有效的条件重新分配内存。其次,当 realloc 失败时,您返回null
并尝试通过 do 访问内存0
Xcc[i][num[i]] = k;
问题
- 矩阵的作用是什么?
- 你为什么不修改
matrix
matrix[i*cols +k] == 0
是真的?
言论
- 没有空间时不要增加
1
!IT 效率非常低,因为在某些点之后,每次插入都需要一个重新分配。
你不需要reallocf
.当 realloc 失败时,原始内存保持不变。如果无法为新项分配更多空间,请停止插入方法并返回错误。