gpt4 book ai didi

c++ - 我的 C++ 析构函数中出现双重释放或损坏 (!prev) 错误

转载 作者:行者123 更新时间:2023-11-28 05:46:03 25 4
gpt4 key购买 nike

我有一个程序可以对 vector 进行操作,不改变它们,而只是读取一次,然后根据给定的内容写出所需的内容。我的程序运行但最后出现此错误;

*** Error in './volimage: double free or corruption (!prev): 0x00000000123c10 ***

我用谷歌搜索了一下,似乎问题出在我的析构函数上,但我终究无法找到或解决它。

这是析构函数:

VolImage::~VolImage()
{
std::cout << "Destructor" << std::endl;
//deconstructing the vector of slices
int i, j, k;
for (i = 0; i<size; i++)
{
for (j = 0; j<height; j++)
{
delete[] slices[i][j];
}
delete[] slices[i];
}
slices.clear();
}

使用以下内容填充 vector :

std::vector<unsigned char**> slices; // data for each slice, in order

//populating vector
int i, j, k;
unsigned char ** rows = new unsigned char*[height];
for (i = 0; i < size; i++)
{
for (j = 0; j < height; j++)
{
unsigned char* cols = new unsigned char[width];
string num = "%d" + j;
fileName = baseName + num + ".raw";
myFile.open(fileName);
for (k = 0; k < width; k++)
{
unsigned char x;
myFile >> x;
cols[k] = x;
}
myFile.close();
rows[i] = cols;
}
slices.push_back(rows);
}

谢谢,如果我需要尽快提交,请尽快回复

最佳答案

您只为指针分配了一次用于存储指针的缓冲区。您必须为每一行分配一个。

另请注意 string num = "%d" + j; 行很有可能导致超出范围的访问,因为"%d" + j相当于&"%d"[j]并且只有 0 <= j < 3是允许的。

还有一件事:rows[i] = cols;应该是 rows[j] = cols;正如@dasblinkenlight 所说。

试试这个:

//populating vector
int i, j, k;
for (i = 0; i < size; i++)
{
unsigned char ** rows = new unsigned char*[height]; // move this line
for (j = 0; j < height; j++)
{
unsigned char* cols = new unsigned char[width];
std::stringstream ss;
string num;
ss << j;
ss >> num; // convert the integer stored in j to string
fileName = baseName + num + ".raw";
myFile.open(fileName);
for (k = 0; k < width; k++)
{
unsigned char x;
myFile >> x;
cols[k] = x;
}
myFile.close();
rows[j] = cols;
}
slices.push_back(rows);
}

添加#include <sstream>到你的代码,如果它不存在使用 std::stringstream .

关于c++ - 我的 C++ 析构函数中出现双重释放或损坏 (!prev) 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36191066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com