Сбой при доступе к структуре UiController в Qt: проблемы управления памятью при инициализации структурыC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Сбой при доступе к структуре UiController в Qt: проблемы управления памятью при инициализации структуры

Сообщение Anonymous »

Программа аварийно завершает работу при использовании пользовательской структуры (не указателя) в качестве переменной-члена в подклассе, унаследованном от QWidget.
Шаги по воспроизведению (Qt Creator с qmake, Qt6.5.3 с MSVC2019(2022)):
  • Создайте родительский проект с именем «P».
  • Создайте три подпроекта с именами «M», «C» и «U», где «M» будет исполняемой записью, «C» — промежуточным проектом, а «M» — обеспечивающим Компоненты пользовательского интерфейса (зависимости: M зависит от C и U, а C зависит от U).
  • В «U» создайте класс под названием MyWidget. Класс содержит структуру пользовательского интерфейса, и этот класс экспортируется с помощью Q_DECL_EXPORT.
  • И в «M», и в «U» включите MyWidget и импортируйте его с помощью Q_DECL_IMPORT.

    Программа отлично работает при использовании непосредственно в «M». Однако когда «M» вызывает «C» (который создает прокси-класс в «C» для обработки создания MyWidget и предоставляет его логику «M»), программа аварийно завершает работу.
Работа в режиме «Выполнить» приводит к сбою без предупреждений. При работе в режиме отладки сбой каждый раз происходит на разных строках.
Если этот объект создается только в проекте «C», произойдет сбой дважды:

Код: Выделить всё

new MyQWidget;
new MyQWidget;//crushed.
Пример класса MyWidget:

Код: Выделить всё

    class EXPORT MyWidget : public QWidget {
MyUiStruct ui;
//just empty body in cpp source.
explicit MyWidget(QWidget* parent = nullptr);
~MyWidget() noexcept;
... No need more code, do nothing in cpp source code.
}
Пример структуры пользовательского интерфейса:

Код: Выделить всё

        struct MyUiStruct {
private:
const MyPathInfo pathInfo;
... No need more code.
}
Пример структуры Path:

Код: Выделить всё

    struct MyPathInfo {
QString proHuiDir;
QString huiFileName;
QString path;
#if defined(QT_DEBUG) && defined(_USE_CODE_EDITOR)
QString huiDir;
QString sourceCodeDir;
QString classFileName;
#endif
MyPathInfo () {
#ifdef __PRO_HUI_DIR
proHuiDir = __PRO_HUI_DIR;
#else
proHuiDir = ":/h_ui";
#endif
huiFileName = "my_ui_file.hui";
#if defined(QT_DEBUG) && defined(_USE_CODE_EDITOR)
classFileName = "MyUi";
#endif
path = proHuiDir + "/" + huiFileName + ".hui";
}
#if defined(QT_DEBUG) && defined(_USE_CODE_EDITOR)

void setHuiDir(const QString& dir) {
huiDir = dir;
path = huiDir + "/" + huiFileName + ".hui";
}

void setCodeDir(const QString& dir) {
sourceCodeDir = dir;
}
#endif

};
Если я изменю ui на указатель и инициализирую его в конструкторе MyWidget, проблема не возникнет. Я не уверен, почему это происходит, и надеюсь, что эксперт сможет дать некоторые рекомендации. Спасибо (в режиме отладки точка останова может появиться в деструкторе QImage, в месте выделения памяти для QArray или в других местах, и это непредсказуемо.)

Подробнее здесь: https://stackoverflow.com/questions/792 ... ssues-with
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»