c++ - 删除分配的内存时损坏的内存问题
问题描述
我正在尝试使用位掩码存储稀疏向量。我分配 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;
}
解决方案
推荐阅读
- python - 使用 flasgger 库在 Python 中 Swagger 更改基本 URL
- c# - System.TypeLoadException 发生在具有不同版本的重复依赖项上
- electron - 如何在 Electron Js 中正确嵌入 Google Data Studio 报告?
- pandas - Pandas - 将行拆分为多列时出错
- c# - 如何在 Visual Studio C# 中制作一个将特定文本插入文本框中的按钮?
- javascript - 如何在 Microsoft Teams sdk 上使用后退按钮处理程序
- java - 是否有必要在 Hibernate 的 Proxy 对象的哈希码实现中使用 getter?
- datetime - 带有谷歌驱动表的 Arduino 数据记录器
- javascript - div上的ScrollTop,Vuejs
- r - 提取文本中的第一个括号,其中包含一些观察的条件