首页 > 解决方案 > 删除分配的内存时损坏的内存问题

问题描述

我正在尝试使用位掩码存储稀疏向量。我分配 achar*来表示位掩码。但是,当我delete []戴上面具时,我得到一个内存损坏错误。经过调查,我发现这是因为我正在释放我不应该释放的内存。这很令人困惑,因为我不明白这是怎么回事。

当我在我的情况下运行它时,它会打印出来"ALLOCATED""DEALLOCATING"但没有更多。

void set_i_bit(char* mask, int i) {
  int field_num = floor(i/8);
  int bit_num = i %8;
  mask[field_num] = (1 << bit_num) | mask[field_num];
}

int write_sparse_with_bitmask(vector<float> arr, ofstream* fout) {
  int mx_sz = arr.size() - 1;
  float tol = 0.5;
  char* mask  = 0;
  for(int i = arr.size() -1; i>=0; i-=1) {
    if (fabs(arr[i]) > tol) break;
    mx_sz = i;
  }
  int sprse_cnt = 0;
  for(int i = 0; i<=mx_sz; i+=1) {
    if (fabs(arr[i]) < tol) sprse_cnt++;
  }
  int bitmask_sz = ceil(mx_sz/8);
  if (sprse_cnt*sizeof(int16_t) + sizeof(int16_t) > bitmask_sz) {
    cout<<"ALLOCATED"<<endl;
    mask = new char[bitmask_sz];
    for (int i =0; i<bitmask_sz; i++) mask[i] = 0;
    for(int i = 0; i<=mx_sz; i+=1) {
      if (fabs(arr[i]) > coef_tol) {
        set_i_bit(mask, i);
      }
    }
  }
  else {
    bitmask_sz = 0;
  }
  uint16_t sz = mx_sz + 1;
  uint16_t bt_msk = bitmask_sz + 1;
  char flag = 0;
  if (bitmask_sz > 0) {
    flag = flag | 1;
  }
  fout->write((char*)&sz, sizeof(uint16_t));
  fout->write((char*)&flag, sizeof(char));
  int w_size = sizeof(uint16_t) + sizeof(char);
  if (flag & 1) {
    fout->write((char*)&bt_msk, sizeof(uint16_t));
    fout->write(mask, sizeof(char)*bt_msk);
    cout<<"DEALLOCATING"<<endl;
    delete [] mask;
    cout<<"THIS DOESN'T PRINT"<<endl;
    w_size += sizeof(uint16_t) + sizeof(char)*bt_msk;
  }
  for(int i = 0; i<=mx_sz; i+=1) {
    if (fabs(arr[i]) > tol || !(flag & 1)) {
      int16_t vl = arr[i];
      fout->write((char*) &vl, sizeof(int16_t));
      w_size += sizeof(int16_t);
    }
  }
  return w_size;
}

标签: c++pointersmemory-management

解决方案


推荐阅读