Кажется, я не могу поймать это исключение в C

#c #exception #runtime #bad-alloc

#c #исключение #время выполнения #bad-alloc

Вопрос:

По какой-то причине программа завершает работу при выполнении во время тестирования обработки исключения. Это класс, который я использую в качестве получателя исключения

 #ifndef _BADALLOC
#define _BADALLOC
#include <cstring>
using namespace std;
class badalloc{
private:
    char* Message;
    double Number;
    
public:
    explicit badalloc(char* M="Error",const int amp; N=0)  {strcpy(Message,M); Number=N;}
    char* what () const {return Message;}
};
#endif
  

это функция-член другого класса, который генерирует исключение

 void ContoCorrente::Prelievo ( const double amp; P) throw ( badalloc )
{
if(P>0)
{ 
    throw (badalloc ("ERROR 111XX",P));
} ...
  

тест основной :

 try
{
c2.Prelievo(20);

}
catch ( badalloc e)
{
    cout<<e.what()<<endl;
}
  

вывод:


Процесс завершен через 1.276 секунд с возвращаемым значением 3221225477 Нажмите любую клавишу, чтобы продолжить . . .

я попытался определить объект badalloc для выброса как «const», но безрезультатно. есть идеи?

Комментарии:

1. _BADALLOC идентификатор зарезервирован для языковой реализации. Определив его, ваша программа будет иметь неопределенное поведение. Вы должны использовать другой макрос в качестве защиты заголовка.

2. Имена, которые начинаются с подчеркивания, за которым следует заглавная буква ( _BADALLOC ), и имена, которые содержат два последовательных подчеркивания, зарезервированы для использования реализацией. Не используйте их в своем коде.

3. Спасибо за ваши предложения, я изменил идентификатор. К сожалению, проблема все еще остается

Ответ №1:

Очень просто, вы копируете на неинициализированный указатель Message в вашем badalloc классе.

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

Редактировать

Вот возможное решение, использующее std::string , чтобы избежать проблем с указателем.

 #ifndef _BADALLOC
#define _BADALLOC

#include <string>

class badalloc{
private:
    std::string Message;
    double Number;
    
public:
    explicit badalloc(const char* M="Error",const int amp; N=0) : Message(M), Number(N) {}
    const char* what () const {return Message.c_str();}
};

#endif
  

Комментарии:

1. я уже тестировал это ранее и проверил еще раз, теперь я могу создать объект badalloc и правильно использовать его функцию what(), программа работает просто отлично. Это не я, чтобы мне не нравился ваш комментарий, я ценю любую помощь

2. @cercio Конечно, вы можете видеть, что копируете в неинициализированный указатель? Пока вы не исправите эту ошибку, поведение вашего кода будет непредсказуемым.

3. итак, каким было бы решение?

4. Есть много решений. Самый простой способ — использовать std::string вместо указателя.

5. @cercio Как вы можете видеть здесь cpp.sh/3xnq7 мой код работает нормально. У вас должны быть проблемы в другом месте вашей программы.