我的c ++析构函数中出现双重自由或损坏(!prev)错误

时间:2016-03-24 00:10:30

标签: c++ memory-management vector destructor

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

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

我用google搜索,似乎问题出在我的析构函数上,但我不能为我的生活找到或解决它。

这是析构函数:

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();
}

使用以下内容填充载体:

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);
}

谢谢,我会很感激,因为我需要尽快提交

2 个答案:

答案 0 :(得分:2)

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

另请注意,@Html.Raw(Html.TextBoxFor(m => m.File).ToHtmlString().Replace("type=\"text\"", "type=\"file\"")) 行很有可能导致超出范围的访问权限,因为string num = "%d" + j;等同于"%d" + j且仅允许&"%d"[j]。< / p>

还有一件事:0 <= j < 3应为rows[i] = cols;,正如@dasblinkenlight所说。

试试这个:

rows[j] = cols;

如果代码不存在,请//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>

答案 1 :(得分:-1)

这不是一个直接的答案,我同意@ MikeCAT的回答。我想添加到soln下发布的评论:(我没有足够的代表直接发表评论)。  Please see here sizeof(slices)返回24的原因。

如果(width * height * sizeof(slices[0][0][0]) ) * size存在,则slices[0][0][0]之类的内容如何。