#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 мой код работает нормально. У вас должны быть проблемы в другом месте вашей программы.