Задать вопрос
  • Почему delete вызывает ошибку?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Первая ошибка:
    char *marka_ = new char;

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

    Вторая ошибка:
    char* m = "Renault"

    Тут используется значение аргумента по умолчанию, где у вас строковая константа. Тут не происходит копирование строки, просто в переменную m сохраняется адрес вот этой вот константы, которую компилятор куда-то в памяти проложения засунет. Вы не выделяли эту память, поэтому попытка сделать delete на ней - неопределенное поведение, что в данном удачном случае приводет к крэшу.

    У вас вообще проблема тут - marka может указывать на выделенную вами в Input() память, а может указывать на переданную из вне память. Кто ее удалять должен-то? Так же в Input() вы можете переписать переданный в конструкторе указатель. А надо ли было его удалять классу?

    Я бы сделал в конструкторе всегда копирование переданной строки. Тогда можно будет передавать туда и строковые константы и использовать вот такое вот значение по умолчанию.
    Ответ написан
    Комментировать
  • Почему delete вызывает ошибку?

    Adamos
    @Adamos
    Главная ошибка - в нашей системе образования,где одни мудаки накропали методичек с использованием массивов и сишных строк в С++, а другие учат по ним третьих, и конца этому не видно.
    Хотя в этом коде достаточно было бы использовать string везде вместо char* - и при этом всем было бы легче: и ТС, и проверяющему, и компилятору... и никаких утечек с UB.
    Ответ написан
    Комментировать
  • [OpengGL] Почему вращается ось, а не фигура?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Потому что вы сначала повернули, а потом стали задавать координаты. Поворот всегда поворачивает все пространство относительно нуля.

    Если хотите вращать только фигуру, то сначала через glTranslate перенесите ее центр в ноль, потом вращайте и задавайте координаты вершин (относительно центра!).
    Ответ написан
    9 комментариев
  • Как добавить lib файл в g++?

    @res2001
    Developer, ex-admin
    Файлы *.lib - это для микрософтовского компилятора.
    gcc нужны либо *.dll (для динамических библиотек), либо *.a (для статических).
    Ответ написан
    1 комментарий
  • Как изменить атрибуты в объекте C++ через ввод?

    @res2001
    Developer, ex-admin
    Ошибка, очевидно, тут: cin >> mark;
    У вас mark - это указатель (а не строка). При этом указатель никуда не указывает (не инициализирован). Следовательно память под чтение не выделена. Куда по вашему должна попадать прочитанная информация?
    Напомню, что указатель это целое беззнаковое число (размером в 4 или 8 байт в зависимости от платформы, могут быть и другие варианты, но это больше экзотика), которое интерпертируется как адрес в памяти. Если в указателе мусор (как сейчас), то запись по этому указателю вызовет SEGFAULT при выполнении программы, вам повезло - компилятор сам заметил эту ошибку, с SEGFAULTом разбираться обычно труднее.

    Но и это еще не все.
    В следующей строке вы создаете временный объект Car с помощью вызова конструктора, после выхода из Input этот объект сразу уничтожается.

    Вам нужно:
    1. выделить память под marka. Лучше всего использовать не char*, а std::string, тогда память будет выделяться автоматически.
    2. читать ввод не в mark, а в marka. То же самое и для других двух переменных класса.
    Ответ написан
    1 комментарий
  • Как построчно сравнить два файла txt?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Забавно, без малого год назад я уже отвечал на этот же вопрос от другого пользоватля. Слово в слово этот же!
    Ответ написан
    4 комментария
  • Почему возникает эта ошибка?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Надо смотреть, что там get_childrens возвращает. Судя по ошибке, там где-то замешаны unique_ptr, которые нельзя просто копировать.

    Подозреваю, что ошибка исправится, если в for сделать item ссылкой.
    Ответ написан
    1 комментарий
  • Что находится в .text секции?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    В .text Находится исполняемый код.

    6kb там не зря. Там куча вспомогательного кода, чтобы взаимодействовать с операционной системой. Начиная от загрузки всяких внутренностей libc, до настройки консоли.
    Ответ написан
    Комментировать
  • STD::set erase не работает?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас в set хранятся указатели на char. В set они сравниваются как указатели. Как значения адресов. Strcmp же смотрит на содержимое памяти, на которую указатели ссылаются. Поэтому имея в памяти две совпадающие строки вы получите вот это вот - указатели не равны, а strcmp - равно.
    Ответ написан
    Комментировать
  • Как исправить ошибку сегментации C++ (segmentation fault)?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Segmentation fault - это ошибка работы с памятью. Ваша программа вылезает за границы вашей памяти или делаете что-то не то с указателями.

    Одна очевидная ошибка - вы не уменьшаете n при удалении элемента. И тогда на следующей итерации вы будете что-то делать с элементом за концом массива.

    Еще одна ошибка у вас в том, что вы в add, например, всегда удаляете указатель на f. А в самом начале этот указатель неинициализирован. Удаление такого случайного указателя - это undefined behavior. Программа может упасть сразу, а может только на следующей итерации цикла.

    Советую инициализировать f в nullptr и перед удалением всегда проверять, что удаяемый казатель не нулевой.
    Ответ написан
    2 комментария
  • Почему вызов метода класса гораздо медленее вызова обычной функции и как это исправить?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Подозреваю, что дело в оптимизаторе. В первом примере компилятор понимает, что цикл ничего не делает и вырезает его весь нафиг. Во втором же случае, разделение на файлы не позволило оптимизатору убрать цикл. Можно покрутить опциями оптимизатора, что бы была кросс-модульная оптимизация (не помню правильное название), но в итоге вы будете сравнивать пустоту с пустотой.

    Правильнее добавить в тестируемую функцию какую-то работу. Тогда вы будуте действительно сравнивать вызов функции и метода. Или отключить всю оптимизацию.
    Ответ написан
    2 комментария
  • Как получить вывод команды с терминала в переменную?

    @res2001
    Developer, ex-admin
    Через файл - это самый простой вариант.
    Более технологичный вариант - запускать процесс с перенаправлением потоков stdin/stdout/stderr в каналы (pipe).
    В этом случае можно в режиме "on-line" получать вывод от запущенного приложения и генерировать вход для приложения. Этот сложнее, но дает гораздо больше гибкости в работе с запускаемым процессом.
    Ответ написан
    Комментировать
  • Как добавить Lua дополнения в игру?

    @res2001
    Developer, ex-admin
    Кроме Lua добавляют и Python и другие интерпретируемые языки.
    Это называется "встраивание Lua" в свое приложение (embeded Lua, embeded Python, ...). Гуглите в этом направлении.
    В официальной документации по питону, есть отдельный раздел на эту тему. Видимо, то же и в Lua должно быть.
    Ответ написан
    6 комментариев
  • Как начать C++ с абсолютного нуля в IT?

    Adamos
    @Adamos
    С Питона - взяв любой бесплатный курс для начинающих.
    Переменные, ветвление, циклы и функции примерно одинаковы во всех С-подобных языках, но в С++ придется узнать еще кучку подробностей и нюансов, это дольше.
    А так ты буквально за пару недель сможешь начать понимать, как вообще программируют, и осознать, что тебе нравится не программирование, а игрушки...
    Если же вдруг зацепит и взбодрит - вторым номером начинай курс гугления и английского. Например, от запроса "C++ gamedev roadmap".
    Ответ написан
    1 комментарий
  • Можно мне книг по шаблонному программированию в С++?

    @res2001
    Developer, ex-admin
    Для теории есть книга "Шаблоны С++".
    Так же можно посмотреть исходники STL там шаблоны очень активно применяются. А так же и другие свободные библиотеки, например boost.
    Ответ написан
    1 комментарий
  • Сдвиг двумерного массива, появление ошибки Stack around the variable 'arr' was corrupted. Как исправить без переписывания кода?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Код исправляется элементарно. Надо внутренний цикл по j гнать не до 0, а до 1. Что бы не вылезать за границу массива, вы же там к j-1 -ому элементу обращаетесь. А поскольку вы делаете swap, то вы меняете элементы массива с памятью перед ним. Массив - локальная переменая, а значит он лежит на стеке и вот это вот затирание памяти рядом с массивом и есть это самое "Stack around the variable 'arr' was corrupted".

    Ну и по стилю - вместо i > -1 обычно пишут i >= 0.
    Ответ написан
    Комментировать
  • Существует ли constexpr std::pow?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Используйте static_math, там есть constexpr-версии популярных математических функций.

    Некоторые реализации стандартной библиотеки также поддерживают этот трюк, но не все - так как в Стандарте написано, что математические функции стандартной библиотеки должны менять значение errorno при ошибках, что невозможно в constexpr-варианте
    Ответ написан
    Комментировать
  • Почему при вызове деструктора не меняется переменная?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Я так понимаю, у вас проблема со строчкой
    aobj1[0] = a(2);

    Тут вызывается конструктор для временного значения a. Потом оператор копирования из временной переменной в *aobj. Потом вызывается деструктор временного значения.

    А потом где-то в конце произойдет и деструктор aobj.

    У aobj delete_counter после этой строчки равен 1 (ведь он скопирован у временного значения, которое сделало delete_counter единицей в констукторе). В конце при вызове деструктора aobj там delete_counter будет 1 в начале.

    Вы смотрите на адрес this в дебагере в деструкторе. Два вызваных деструктора будут для двух разных объектов (для временного значения и для aobj).

    Если вы хотите какой-то счетчик ссылок делать, то вам надо переопределять операторы копирования и перемещения (а так же все возможные конструкторы). И там аккуратно изменять счетчик ссылок. И счетчик ссылок должен быть частью общего объекта - частью класса b, а не класса a.
    Ответ написан
    4 комментария
  • Какой язык программирования выбрать чтобы стать игровым разработчиком?

    GavriKos
    @GavriKos Куратор тега Разработка игр
    И тот и тот язык в геймдеве востребован - в общем смысле. А сможете ли вы найти работу в конкретном случае - никто не знает, так что советовать что то тут смысла нет
    Ответ написан
    Комментировать
  • Где взять дорожную карту c++?

    Adamos
    @Adamos
    Какой именно интернет вы весь перекопали?
    Первая же строчка по запросу в гугле "unreal engine developer roadmap", например - не устраивает?
    Может, вам и не стоит в С++?..
    Ответ написан
    Комментировать