Ошибка сегментации в конструкторе

Это происходит с КАЖДЫЙ класс я пытаюсь сделать в C ++. Мигрируя из Java, я нахожу проблемы в основном в занятиях. Я запускаю valgrind, и он в конструкторе, похоже, что есть.

==30214== Memcheck, a memory error detector
==30214== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==30214== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==30214== Command: ./CoC
==30214==
==30214==
==30214== Process terminating with default action of signal 11 (SIGSEGV)
==30214==  Bad permissions for mapped region at address 0x404B4F
==30214==    at 0x4C2B9EC: strcat (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30214==    by 0x404220: Model::Model(std::string) (in /home/kronus/Apollo/CoC)
==30214==    by 0x402617: main (in /home/kronus/Apollo/CoC)

Как видите, я пытаюсь вызвать конструктор этого модельного класса в метод main. Вот код для конструктора

Model::Model(std::string filename)
{
m_TotalFaces = 0;
m_model = lib3ds_file_load(filename.c_str());
// If loading the model failed, we throw an exception
if(!m_model)
{
throw strcat("Unable to load ", filename.c_str());
}
}

Когда он вызывается, он закрывается с ошибкой сегментации. Важно: я объявил класс внутри заголовочного файла. Это когда я получаю ошибку. Я поместил класс в исходный файл, и он работает нормально. Что я делаю неправильно?

2

Решение

strcat пытается записать строку, на которую указывает второй аргумент, в конец строки, на которую указывает первый аргумент. Так как первый аргумент является строковым литералом (который следует рассматривать только для чтения), вы получаете неприятный segfault.

Я предлагаю изучать C ++, как будто это совершенно другой язык на Java, потому что в противном случае вы можете думать, что аналогичный функция функции тот же самый. Это опасно Обезьяна может выучить Java, потирая лицо на клавиатуре. С ++ имеет неопределенное поведение, которое может работать на вашем компьютере правильно, но запускать ядерные ракеты на другом.

9

Другие решения

Вы добавляете к константной строке, которая неверна:

strcat("Unable to load ", filename.c_str());
^ you can't append to constant

Прочитай это: C ++ исключение: бросая std :: string
Возможно, вы захотите избегать использования строк в качестве классов исключений, потому что они сами могут генерировать исключение во время использования.

второй: Какой тип я должен поймать, если я брошу строковый литерал?

2

По вопросам рекламы [email protected]