Передайте короткий беззнаковый указатель на функцию, которая используется в качестве ссылки для обрезки изображения - PullRequest
0 голосов
/ 27 апреля 2018

Эта программа дает сбой !, как новичок может кто-нибудь сказать, где здесь происходит повреждение памяти и что делать, чтобы решить эту проблему?

Здесь я пытаюсь извлечь ROI из части данных и снова привязать ее к исходным данным.

Измененный код ниже, здесь нет проблем, и 'newdata' будет обрезать данные из исходной переменной 'data'

#include "stdafx.h"

#include <iostream>
using namespace std;

void ExtractROI(unsigned short *image, int nRows, int nCols, unsigned short *imageROI)
{
    int indexROI = 0;
    for (int i = 0; i < nRows; i++)
    {
        for (int j = 0; j < nCols; j++)
        {
            imageROI[indexROI] = image[i * nCols + j];
            indexROI++;
        }
    }
}

int main()
{
    const int nRows = 12;
    const int nCols = 12;
    unsigned short *data = new unsigned short[nRows * nCols];
    for (int i = 0; i < nRows; i++)
    {
        for (int j = 0; j < nCols; j++)
        {
            data[i * nCols + j] = i * nCols + j;
        }
    }

    unsigned short *newdata = new unsigned short[2 * 2];
    memset(newdata, 0, sizeof(unsigned short) * 2 * 2);

    ExtractROI(data, 2, 2, newdata);

    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            cout << "(" << i << "," << j << ")" << " = " << newdata[i * 2 + j] << endl;
        }
    }

    delete[] data;
    delete[] newdata;

    char x;
    cin >> x;

    return 0;
}

/ * Старый код ниже * /

#include "stdafx.h"

#include <iostream>
using namespace std;

void ExtractROI(unsigned short *image, int nRows, int nCols, unsigned short *imageROI)
{
    int indexROI = 0;
    for (int i = 0; i < nRows; i++)
    {
        for (int j = 0; j < nCols; j++)
        {
            imageROI[indexROI] = image[i * nCols + j];
            indexROI++;
        }
    }
}

int main()
{
    const int nRows = 12;
    const int nCols = 12;
    unsigned short *data = new unsigned short[nRows * nCols];
    for (int i = 0; i < nRows; i++)
    {
        for (int j = 0; j < nCols; j++)
        {
            data[i * nCols + j] = i * nCols + j;
        }
    }

    unsigned short *newdata = new unsigned short[2 * 2];
    memset(newdata, 0, sizeof(unsigned short) * 2 * 2);

    ExtractROI(data, nRows, nCols, newdata);

    data = newdata;

    for (int i = 0; i < nRows; i++)
    {
        for (int j = 0; j < nCols; j++)
        {
            cout << "(" << i << "," << j << ")" << " = " << data[i * nCols + j] << endl;
        }
    }

    /*delete[] data;
    delete[] newdata;*/

    char x;
    cin >> x;

    return 0;
}

1 Ответ

0 голосов
/ 27 апреля 2018

Внутри циклов в ExtractROI переменная indexROI будет увеличена в общей сложности nRows * nCols раз. Поскольку вы передаете 12 для каждого, indexROI в конце будет 12 * 12 (или 144). Это намного больше, чем 2 * 2 (или 4) элементов, выделенных для imageROI.

Выход за пределы выделенной памяти приводит к неопределенному поведению .

После вызова ExtractROI у вас возникла та же проблема в циклах. А также утечка памяти (вы теряете то, на что изначально указывал data).

...