Повреждена проблема с памятью при удалении выделенной памяти - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь сохранить разреженный вектор, используя битовую маску. Я выделяю char* для представления битовой маски. Однако, когда я 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...