c++ - 在循环中使用 Realloc

标签 c++ c memory-leaks segmentation-fault realloc

我试图模拟使用push_back时 vector 容器的行为。我创建了一个指针数组。每个元素可以有不同的长度,因此每次存储新元素时我都需要重新分配:

   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];

对于通用 i,Xcc[i] 未初始化,则对 realloc() 的调用有时可能有效(如果 Xcc[i] 为 null),有时则可能无效(段错误)。

您缺少:

memset(Xcc, 0, sizeof(int*) * rows);

关于c++ - 在循环中使用 Realloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12428150/

相关文章:

c++ - CUDA 程序的输出为空

c# - 获取当前的笔记本电脑盖子状态

C++内存泄漏对象通过函数返回

c - 数据存入heap后,如何存入struct而不致栈溢出?

c# - ShowDialog() 内存泄漏解决方法

node.js - 使用下载管理器取消下载时 Nodejs 内存泄漏

c# - C#'s operators' 操作顺序

c++ - 如何根据标记分隔字符串

C 中的 Crypto++ 等价物

c - 为什么 bool/char 分配是 4 个字节而不是 1 个字节?