станд.:: строка:: присвойтесь (), вызывает segfault

Вы знаете, новый драйвер (по крайней мере, на Linux), который способен к этому, вероятно, не было бы это трудно для записи.

, С другой стороны, это было бы безумие для создания программ как это. Если у Вас нет некоторого действительно определенного и единственного использования для такой вещи, я не рекомендовал бы это. Если бы Вы создали крупное приложение, загруженное постоянными проверками достоверности указателя, то это, вероятно, было бы страшно медленно.

7
задан Keith Pinson 4 February 2013 в 16:01
поделиться

1 ответ

Скорее всего, в вашем коде есть несоответствие «освобождение / удаление», которое задерживает появление симптома до сих пор. Когда вы используете освобожденную память, операционная система может продолжать работу столько, сколько сочтет нужным.

Попробуйте запустить программу в valgrind. valgrind использует свой собственный malloc и free, поэтому он может предупреждать вас о неверных новостях и удаляет. Убедитесь, что компилируется без оптимизаций и с -g 1 :

g++ -g main.cc -o binary
valgrind --leak-check=full ./binary

Убедитесь, что вы не создали указатель из переменной стека, выходящей за пределы области видимости. Например, это распространенная ошибка среди новых разработчиков:

int *foo() {
    int a = 0;
    // do something to a here
    return &a;
}

Поскольку a вышел за пределы области видимости, вы возвращаете указатель на освобожденную память.


1 О -g , от страница руководства: Создание отладочной информации в собственном формате операционной системы (stabs, COFF, XCOFF, или DWARF 2). GDB может работать с этой отладочной информацией.

14
ответ дан 6 December 2019 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: