Проблема области действия с экземпляром класса в кнопке - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть некоторый код, который находится внутри кнопки в графическом интерфейсе Qt. Этот код создает экземпляр класса, который я разработал, который выполняет некоторую обработку и возвращает беззнаковый символ **, например, так:

void Viewer::button_click()
{
    Classifier *pc = new Classifier(hhfile, vvfile, hvfile,aoix, aoiy,aoiw, aoih, target, filter );
    unsigned char **data = pc->classify();
.
.
.
}

При первом нажатии на кнопку данные массива содержат правильную информацию. Без изменения каких-либо параметров в классе Classifier, если я снова нажму кнопку, данные вернутся FUBAR'd.

Я не делаю явного удаления данных или компьютера, но должен ли я это делать? Они находятся в области действия кнопки, так что, я думаю, я думал, что должен получить точно такие же результаты, независимо от того, что происходит с данными или происходит внутри класса Classify. Это правильно? Каковы возможные причины того, что передача одних и тех же параметров классу дважды подряд даст разные результаты?

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

new - это ключевое слово, используемое языком, когда вы указываете, что хотите что-то, что выживет за пределами области действия функции. Для объектов области действия вы просто объявляете их, то есть

Classifier pc(hhfile, vvfile, hvfile,aoix, aoiy,aoiw, aoih, target, filter );

Нужно ли вам что-то делать с памятью, возвращенной classify(), я не могу сказать, не видя источника.

Наиболее вероятная проблема заключается в том, что ваши аргументы являются ссылками или указателями, и вы изменяете эти данные, когда это не требуется.

0 голосов
/ 07 апреля 2011

, если classify(); работает с одними и теми же данными для каждого вызова, вы будете изменять его каждый раз и, возможно, получить повреждение данных. Я понятия не имею, что делает classify (), так сложно сказать.

Кроме того, есть ли причина, по которой классификатор является указателем, а не просто автоматической переменной?

Затем вы создаете его в локальной области действия при каждом щелчке, поэтому данные, содержащиеся в этом объекте, исчезают каждый раз, когда вы покидаете область действия, и здесь вы даже пропускаете его с помощью указателя, поскольку вы не выполняете надлежащее управление памятью.

EDIT:

Я бы сделал это:

Classifier pc(hhfile, vvfile, hvfile,aoix, aoiy,aoiw, aoih, target, filter );
unsigned char **data = pc.classify();

Теперь, если ваш класс Classifier не делает что-то странное в функции classify, вы должны получить ожидаемые результаты в соответствии с данными, которые вы нам дали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...