powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как в конструкторе объекта отказаться от его создания?
3 сообщений из 28, страница 2 из 2
Как в конструкторе объекта отказаться от его создания?
    #39544656
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLpetravQt в принципе не работает с исключениями. Это их решение. Твой код не должен выбрасывать исключения в вызовах Qt. Т.е, например, ты не должен вылетать из слота по исключению, не должен вылетать по исключению из любого перегруженного метода Qt и т.д.

Есть детали, можно установить глобальный обработчик сообщений Qt и там поставить свой catch(...), но тут я не помню.

Глобальный обработчик событий не прервет нить выполнения, в которой появилась проблема. Если программа однопоточная, то вообще ничего не произойдет до освобождения потока. В моем случае есть основной поток, обслуживающий рабочие потоки, но надеяться на то, что он особо быстро отработает не приходится.
Прости, не очень понял, что ты хотел сказать. Без обид, я бы пока на твоём месте поостерёгся писать многопоточные приложения. Это сервера SQL почти прозрачно обеспечивают многопользовательский режим с гарантией потокобезопасности - да и там правила игры знать нужно.

AlekseySQLГде можно подробнее прочитать про все ограничения на использование исключений в Qt?
Выше дали ссылку на qt.io. Но, а так здравый смысл и такие статьи. У Саттера и Александресску "Стандарты кодирования на С++" (по памяти) есть раздел про границу между модулями и почему между ними нельзя бросать исключения. Очень похоже на текущий вопрос.
...
Рейтинг: 0 / 0
Как в конструкторе объекта отказаться от его создания?
    #39544715
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLСейчас в исключительно ситуации я делаю такие странные действия:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
void MyLib::SaveAndExit(const int i)
{
    //сообщения об ошибке
    if(i==5) MyLib::MessageError("Ошибка: неудачное выделение памяти!");
    
    //тут необходимо написать код сохранения промежуточных расчетов
    
    
    //глобальный вызов функции завершения работы
    std::terminate();
}

void* MyLib::AllocationMemory(const size_t Size)
{
    void* Array = malloc(Size);

    for(int i = 0; i < 10 && !Array; ++i)
    {
        //подождем 1 секунду и повторим попытку выделения памяти
        QThread::currentThread()->sleep(1);
        Array = malloc(Size);
    }

    if(!Array)
    {
        try {int i = 5; throw i;}
        catch (int i) {MyLib::SaveAndExit(i);}
    }

    return Array;
}



Хочется вместо блока:
Код: plaintext
1.
2.
try {int i = 5; throw i;}
catch (int i) {MyLib::SaveAndExit(i);}



Писать просто:
Код: plaintext
1.
throw (int) 5;





Да, код бредовый...


AlekseySQLИ еще вопрос: насколько уместна попытка подождать и попытаться выделить память еще раз?

Бесполезна. Откуда память-то возмётся?
можно что-то попытаться освободить, и ещё раз попробовать выделить память...
Хотя конечно это на 100% зависит от операционной среды (компилятор и операционная система)
...
Рейтинг: 0 / 0
Как в конструкторе объекта отказаться от его создания?
    #39544969
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приплюснутыйникак не может быть верным. Объект, который никогда не был создан, остаться живым не может.я не совсем правильно выразился. То, что выделено в конструкторе, остаётся жить. Проверил сохранением this перед throw из конструктора, после исключения все данные(члены класса простых типов) из скопа конструктора были валидными, т.е. выделенные данные пропадут. Кто был с конструктором - удалятся.

ПриплюснутыйНа будущее: есть такая штука — стандарт. Очень помогает уверенно выяснить что и как должно вести себя в языке, без экспериментирования. Спасибо, но не во всех компиляторах всё всегда по стандарту бывает, а во-вторых, знание механизмов на практике способствует лучшему пониманию.
...
Рейтинг: 0 / 0
3 сообщений из 28, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как в конструкторе объекта отказаться от его создания?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]