1

Тема: Process terminated with status -11

Працюю через CodeBlocks, компілятор Clang, проєкт wxWidgets.
Програма компілюється й працює нормально,
але при звичайному закритті видає помилку Process terminated with status -11.
Така помилка виникає лише після зміни мови інтерфейсу.
Що це за помилка, де шукати негаразди?

2

Re: Process terminated with status -11

Це не зовсім помилка, це просто код при завершенні. Що у вас main повертає?

3

Re: Process terminated with status -11

koala написав:

Це не зовсім помилка, це просто код при завершенні. Що у вас main повертає?

Значення bool, має повертати true.

4

Re: Process terminated with status -11

це виникає після зміни мови інтерфейсу ВАШОЇ ПРОГРАМИ, чи самого CodeBlocks?

5

Re: Process terminated with status -11

Vitaliy_Danmer написав:
koala написав:

Це не зовсім помилка, це просто код при завершенні. Що у вас main повертає?

Значення bool, має повертати true.

Це як? bool main()?

6

Re: Process terminated with status -11

FakiNyan написав:

це виникає після зміни мови інтерфейсу ВАШОЇ ПРОГРАМИ, чи самого CodeBlocks?

Моєї програми.

7

Re: Process terminated with status -11

koala написав:
Vitaliy_Danmer написав:
koala написав:

Це не зовсім помилка, це просто код при завершенні. Що у вас main повертає?

Значення bool, має повертати true.

Це як? bool main()?

Проєкти wxWidgets не мають стандартного main.
Ось як це виглядає(перший — header, другий — його реалізація):

#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED

#include <wx/wx.h>

class MyApp : public wxApp
{
public:
    ~MyApp();
    virtual bool OnInit();

    void SelectLanguage(int lang);

    wxLocale* m_locale {nullptr};
};

DECLARE_APP(MyApp)

#endif // MAIN_H_INCLUDED


#include "main.h"
#include "MainFrame.h"

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
    SelectLanguage(wxLANGUAGE_DEFAULT);

    MainFrame* mainframe = new MainFrame(wxT("Movar"));
    mainframe->Show(true);

    return true;
}

void MyApp::SelectLanguage(int lang)
{
    delete m_locale;
    m_locale = new wxLocale(lang);
    m_locale->AddCatalogLookupPathPrefix(wxGetCwd());
    m_locale->AddCatalog(wxT("i18n"));
}

MyApp::~MyApp()
{
    delete m_locale;
}

8

Re: Process terminated with status -11

Vitaliy_Danmer написав:
FakiNyan написав:

це виникає після зміни мови інтерфейсу ВАШОЇ ПРОГРАМИ, чи самого CodeBlocks?

Моєї програми.

тоді тре подивитись на той код, шо змінює мову, бо проблєма може бути саме в тій частині

9

Re: Process terminated with status -11

Метод MyApp::SelectLanguage(int lang) видаляє існуючу m_locale, а потім створює новий екземпляр wxLocale.
Проблема виникає, коли ви неодноразово викликаєте метод SelectLanguage: ви видаляєте m_locale і відразу створюєте новий екземпляр. Якщо m_locale спочатку було nullptr, виклик delete для nullptr є безпечним. Однак, якщо воно не було nullptr (тобто вже було ініціалізовано), можливо, пам'ять не буде повністю звільнена відразу після виклику delete і перед наступним викликом new, що може викликати помилку сегментації.
спробуйте ось так

void MyApp::SelectLanguage(int lang)
{
    if(m_locale)
    {
        delete m_locale;
        m_locale = nullptr; // Встановлюємо його в nullptr після видалення
    }
    m_locale = new wxLocale(lang);
    m_locale->AddCatalogLookupPathPrefix(wxGetCwd());
    m_locale->AddCatalog(wxT("i18n"));
}
Подякували: koala, leofun012

10

Re: Process terminated with status -11

FakiNyan написав:

Метод MyApp::SelectLanguage(int lang) видаляє існуючу m_locale, а потім створює новий екземпляр wxLocale.
Проблема виникає, коли ви неодноразово викликаєте метод SelectLanguage: ви видаляєте m_locale і відразу створюєте новий екземпляр. Якщо m_locale спочатку було nullptr, виклик delete для nullptr є безпечним. Однак, якщо воно не було nullptr (тобто вже було ініціалізовано), можливо, пам'ять не буде повністю звільнена відразу після виклику delete і перед наступним викликом new, що може викликати помилку сегментації.
спробуйте ось так

void MyApp::SelectLanguage(int lang)
{
    if(m_locale)
    {
        delete m_locale;
        m_locale = nullptr; // Встановлюємо його в nullptr після видалення
    }
    m_locale = new wxLocale(lang);
    m_locale->AddCatalogLookupPathPrefix(wxGetCwd());
    m_locale->AddCatalog(wxT("i18n"));
}

Не спрацювало, усе одно та сама помилка з'являється.

11

Re: Process terminated with status -11

Vitaliy_Danmer написав:
FakiNyan написав:

Метод MyApp::SelectLanguage(int lang) видаляє існуючу m_locale, а потім створює новий екземпляр wxLocale.
Проблема виникає, коли ви неодноразово викликаєте метод SelectLanguage: ви видаляєте m_locale і відразу створюєте новий екземпляр. Якщо m_locale спочатку було nullptr, виклик delete для nullptr є безпечним. Однак, якщо воно не було nullptr (тобто вже було ініціалізовано), можливо, пам'ять не буде повністю звільнена відразу після виклику delete і перед наступним викликом new, що може викликати помилку сегментації.
спробуйте ось так

void MyApp::SelectLanguage(int lang)
{
    if(m_locale)
    {
        delete m_locale;
        m_locale = nullptr; // Встановлюємо його в nullptr після видалення
    }
    m_locale = new wxLocale(lang);
    m_locale->AddCatalogLookupPathPrefix(wxGetCwd());
    m_locale->AddCatalog(wxT("i18n"));
}

Не спрацювало, усе одно та сама помилка з'являється.

тоді хз

12 Востаннє редагувалося wander (29.08.2023 14:44:08)

Re: Process terminated with status -11

Vitaliy_Danmer написав:

Не спрацювало, усе одно та сама помилка з'являється.

Воно і не мало б спрацювати.

Vitaliy_Danmer написав:
bool MyApp::OnInit()
{
    SelectLanguage(wxLANGUAGE_DEFAULT);

    MainFrame* mainframe = new MainFrame(wxT("Movar"));
    mainframe->Show(true);

    return true;
}

Щось мені це зовсім не подобається, що робить MainFrame і, як ви гадаєте, що буде з вказівником mainframe після виклику OnInit()? Це по-перше, потім базовий клас wxApp має імплементацію ф-ї OnInit(), якщо так, то що вона робить? Можливо спершу її потрібно викликати..
Ще було б файно бачити call stack з дебагера.
------------------
Ось приклад роботи з wxLanguage/wxLocale з їхнього репозиторію

Прихований текст
bool MyApp::OnInit()
{
    if ( !wxApp::OnInit() )
        return false;

    if ( m_lang == wxLANGUAGE_UNKNOWN )
    {
        int lng = wxGetSingleChoiceIndex
                  (
                    _("Please choose language:"),
                    _("Language"),
                    WXSIZEOF(langNames),
                    langNames
                  );
        m_lang = lng == -1 ? wxLANGUAGE_DEFAULT : langIds[lng];
    }

    // don't use wxLOCALE_LOAD_DEFAULT flag so that Init() doesn't return
    // false just because it failed to load wxstd catalog
    if ( !m_locale.Init(m_lang, wxLOCALE_DONT_LOAD_DEFAULT) )
    {
        wxLogWarning(_("This language is not supported by the system."));

        // continue nevertheless
    }

    // normally this wouldn't be necessary as the catalog files would be found
    // in the default locations, but when the program is not installed the
    // catalogs are in the build directory where we wouldn't find them by
    // default
    wxLocale::AddCatalogLookupPathPrefix(".");

    // Initialize the catalogs we'll be using
    const wxLanguageInfo* pInfo = wxLocale::GetLanguageInfo(m_lang);
    if (!m_locale.AddCatalog("internat"))
    {
        wxLogError(_("Couldn't find/load the 'internat' catalog for locale '%s'."),
                   pInfo ? pInfo->GetLocaleName() : _("unknown"));
    }

    // Now try to add wxstd.mo so that loading "NOTEXIST.ING" file will produce
    // a localized error message:
    m_locale.AddCatalog("wxstd");
        // NOTE: it's not an error if we couldn't find it!

    // Create the main frame window
    MyFrame *frame = new MyFrame(m_locale);

    // Show the frame
    frame->Show(true);

    return true;
}

https://github.com/wxWidgets/wxWidgets/ … 2C1-L275C2

Подякували: leofun011

13

Re: Process terminated with status -11

А ви в ще якісь елементи передаєте цей m_locale? Його може хтось інший видаляти?
Документація каже, що треба ще Init() викликати, щоб локаль працювала, але якось непевно.

14

Re: Process terminated with status -11

delete m_locale;

всюди заміни на

wxDELETE(m_locale);

Доки: wxDELETE(T *&ptr).

15

Re: Process terminated with status -11

Розібрався нарешті. Ця помилка виникає коли повторно звільняється вже звільнений вказівник.
Щоб «на льоту» змінити написи віджетів на панелі знарядь(toolbar) на іншу мову,
треба ці віджети видалити звідти, а тоді створити наново.
Бо якщо не видалити, то просто створюються додаткові, але іншою мовою.
Я видаляв їх неправильно через звичайне delete,
а треба було скористатися функцією wxToolBar — ClearTools().
Щойно зробив це, помилка зникла.

Подякували: koala, leofun012

16 Востаннє редагувалося Teg Miles (29.08.2023 15:45:23)

Re: Process terminated with status -11

wander написав:
Vitaliy_Danmer написав:

Не спрацювало, усе одно та сама помилка з'являється.

Воно і не мало б спрацювати.

Vitaliy_Danmer написав:
bool MyApp::OnInit()
{
    SelectLanguage(wxLANGUAGE_DEFAULT);

    MainFrame* mainframe = new MainFrame(wxT("Movar"));
    mainframe->Show(true);

    return true;
}

Щось мені це зовсім не подобається, що робить MainFrame і, як ви гадаєте, що буде з вказівником mainframe після виклику OnInit()? Це по-перше, потім базовий клас wxApp має імплементацію ф-ї OnInit(), якщо так, то що вона робить? Можливо спершу її потрібно викликати..
Ще було б файно бачити call stack з дебагера.
------------------
Ось приклад роботи з wxLanguage/wxLocale з їхнього репозиторію

Прихований текст
bool MyApp::OnInit()
{
    if ( !wxApp::OnInit() )
        return false;

    if ( m_lang == wxLANGUAGE_UNKNOWN )
    {
        int lng = wxGetSingleChoiceIndex
                  (
                    _("Please choose language:"),
                    _("Language"),
                    WXSIZEOF(langNames),
                    langNames
                  );
        m_lang = lng == -1 ? wxLANGUAGE_DEFAULT : langIds[lng];
    }

    // don't use wxLOCALE_LOAD_DEFAULT flag so that Init() doesn't return
    // false just because it failed to load wxstd catalog
    if ( !m_locale.Init(m_lang, wxLOCALE_DONT_LOAD_DEFAULT) )
    {
        wxLogWarning(_("This language is not supported by the system."));

        // continue nevertheless
    }

    // normally this wouldn't be necessary as the catalog files would be found
    // in the default locations, but when the program is not installed the
    // catalogs are in the build directory where we wouldn't find them by
    // default
    wxLocale::AddCatalogLookupPathPrefix(".");

    // Initialize the catalogs we'll be using
    const wxLanguageInfo* pInfo = wxLocale::GetLanguageInfo(m_lang);
    if (!m_locale.AddCatalog("internat"))
    {
        wxLogError(_("Couldn't find/load the 'internat' catalog for locale '%s'."),
                   pInfo ? pInfo->GetLocaleName() : _("unknown"));
    }

    // Now try to add wxstd.mo so that loading "NOTEXIST.ING" file will produce
    // a localized error message:
    m_locale.AddCatalog("wxstd");
        // NOTE: it's not an error if we couldn't find it!

    // Create the main frame window
    MyFrame *frame = new MyFrame(m_locale);

    // Show the frame
    frame->Show(true);

    return true;
}

https://github.com/wxWidgets/wxWidgets/ … 2C1-L275C2

MainFrame там на місці, я робив це згідно посібника за 2022 рік.
Ваш приклад за 1998 рік, гляньте згори файлу, там дата створення вказана.
Тому я й не користуюсь їхніми прикладами.
Їхній офіційний посібник за 2006 рік, той, що на сайті.
Є ще книга за 2018 рік, але вона польською мовою.
Найсвіжіший посібник за 2022 рік від Zetcode, він в онлайн форматі.

17

Re: Process terminated with status -11

Vitaliy_Danmer написав:

Ваш приклад за 1998 рік, гляньте згори файлу, там дата створення вказана.
Тому я й не користуюсь їхніми прикладами.

Не туди дивишся. Документація від розробників (авторів технології) це джерело для будь-яких посібників.

18

Re: Process terminated with status -11

leofun01 написав:
Vitaliy_Danmer написав:

Ваш приклад за 1998 рік, гляньте згори файлу, там дата створення вказана.
Тому я й не користуюсь їхніми прикладами.

Не туди дивишся. Документація від розробників (авторів технології) це джерело для будь-яких посібників.

Я вивчаю їхню документацію, але там старезні приклади навіть для техдокументації за 2023 рік.
Тому приклади, як на мене, краще дивитися в інших, новіших джерелах.