Код IImebra в приложении C++ с Qt выдает malloc: *** ошибка для объекта xxxxxx: освобождаемый указатель не был выделен

Я пытаюсь преобразовать файл dicom .dcm в .jpeg, используя Imebra в приложении C++, используя Qt Creator в качестве среды разработки.

Я скачал Imebra и смог успешно запустить пример проекта Qt для преобразования Dicom2Jpeg. Но когда я попытался скопировать тот же код в свое приложение на C++, оно не запустилось со следующим сообщением об ошибке:

malloc: *** error for object xxxxxx: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

Я выполнил шаги по добавлению файлов Imebra в свой проект, как это было показано на сайте Imebra. Также использовал их проект qt в качестве примера. Мой main.cpp открывает файл dicom, затем загружает его в набор данных, затем вызывает мое диалоговое окно. Вылетает при загрузке набора данных.

#include "QApplication.h"
#include "QHBoxLayout.h"
#include "mydialog.h"
#include "iostream.h"

include "library/imebra/include/imebra.h"
int main( int argc, char ** argv ){

    using namespace puntoexe;
    ptr<stream> readStream(new stream);
    readStream->openFile("/pathToDcmFile/test.dcm",std::ios_base::in);

    ptr<streamReader> reader(new streamReader(readStream));

    ptr<imebra::codecs::codecFactory> 
    cFactory(imebra::codecs::codecFactory::getCodecFactory());
    ptr<imebra::dataSet> tdataSet;
    tdataSet=cFactory->load(reader,2048);

    Q_INIT_RESOURCE(images);

    QApplication a( argc, argv );

    MyDialog md;
    md.show();

    return a.exec();

}

Более глубокая отладка показала, что источник ошибки находится в функции JpegCodec.cpp файла readStream() при проверке JpegSignature, чтобы увидеть, находится ли он в неправильном формате, что приводит к внутренней ошибке PUNTOEXE «обнаружен неправильный формат».

Интересно, что при запуске того же тестового файла dcm с использованием данного примера dicom2jpeg (который имеет точно такой же код открытия файла и его загрузки) не выдает ошибок и успешно конвертирует в jpeg. Поэтому я знаю, что проблема не в файле, а в том, как код imebra интегрирован в мое приложение на C++.

Моя среда разработки: macbook pro с ОС Lion, Qt Creator, проект Qt, код C++, добавлена ​​библиотека ITK, файлы Imebra полностью интегрированы как часть проекта Qt.

Итак, мой вопрос: как мне работать/связывать/ссылаться/вызывать функции Imebra в проекте Qt? Я забыл что-то связать, или какой-то объект не был создан/удален вовремя?

Любые идеи высоко ценятся,

Евушка

Решение: как было предложено, я изменил фабрику кодеков на фабрику dicm, и это решило проблему. Мой новый код приведен ниже.

imebra::codecs::dicomCodec* pTmp = new imebra::codecs::dicomCodec();

ptr<stream> readStream(new stream);
readStream->openFile(argv[0],std::ios_base::in);

ptr<streamReader> reader(new streamReader(readStream));

ptr<imebra::dataSet> tdataSet;
tdataSet=pTmp->read(reader,2048);

delete pTmp;

person user1288924    schedule 31.10.2012    source источник
comment
Только фокусник сможет ответить на этот вопрос, не видя никакого кода.   -  person Nikos C.    schedule 01.11.2012
comment
1. Вы не задали вопрос. 2. Я согласен с Никосом. Никто не сможет вам помочь, не видя соответствующего кода.   -  person Matt    schedule 01.11.2012
comment
Спасибо за быстрые ответы. Я только что добавил свой код. Пришлось сильно упростить. Я надеюсь, что люди, которые работали с Imebra, смогут пролить свет на этот вопрос.   -  person user1288924    schedule 03.11.2012
comment
Вы можете заменить разные новые, ptr<>: imebra::dataSet* dSet = .... Конечно, вы получите утечку памяти за то время, пока пытаетесь.   -  person Joop Eggen    schedule 03.11.2012
comment
@ Joop: Не знаю, чем заменить различные новые средства, но я попытался изменить их на более подробные заявления. См. изменения в коде выше. Безрезультатно, та же ошибка.   -  person user1288924    schedule 03.11.2012
comment
Я заметил, что Imebra активно использует CriticalSection и Locks. Может в этом источник проблемы?   -  person user1288924    schedule 03.11.2012


Ответы (1)


Ошибка «обнаружен неправильный формат» возникает, потому что библиотека проверяет файл на соответствие всем форматам файлов, и, поскольку вы читаете файл Dicom, код Jpeg выдает исключение, но это должно быть восстановлено фабрикой кодеков. Возможно, вы стали жертвой этой ошибки: https://bitbucket.org/puntoexe/imebra/issue/89/, что предотвращает статическую регистрацию кодека Dicom при запуске, в результате чего заводской кодек полностью пропускает кодек Dicom. Отчет об ошибке также содержит обходной путь.

person Paolo Brandoli    schedule 03.11.2012
comment
СПАСИБО СПАСИБО СПАСИБО! Я изменил фабрику кодеков на кодек dicom, и он работает как шарм. - person user1288924; 06.11.2012
comment
@ user1288924 С удовольствием. Не могли бы вы принять ответ? Спасибо - person Paolo Brandoli; 06.11.2012
comment
@PaoloBrandoli Как я могу отобразить изображение на iPhone с помощью библиотеки Imebra с Environment XCode и устройством iPhone 5? - person Dk Kumar; 15.08.2013