Ошибка строки или ошибки компилятора? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть следующая проблема, когда вывод в отладке, кажется, полностью игнорирует то, что говорит код, и кажется, что это может быть ошибкой в ​​компиляторе, если я что-то упустил.

Так воткод, он должен создать две строки имени файла и удалить один из файлов.

auto *real = (base_dir + "/index.txt").c_str();
auto *bkp = (base_dir + "/index.txt.new").c_str();
remove(real);

Однако на практике это не проявляется, и в действительности мы получаем следующее в gdb:

auto *real = (base_dir + "/index.txt").c_str();
(gdb) n
auto *bkp = (base_dir + "/index.txt.new").c_str();
(gdb) n
remove(real);
(gdb) p real
$1 = 0x7060e8 "./ss-clientdir/index.txt.new"
(gdb) p bkp
$2 = 0x7060e8 "./ss-clientdir/index.txt.new"

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

Это какой-то компилятороптимизация сошла с рельсов или как?

1 Ответ

0 голосов
/ 19 февраля 2019
auto *real = (base_dir + "/index.txt").c_str();
auto *bkp = (base_dir + "/index.txt.new").c_str();
remove(real);

Вы используете real в вызове функции remove(), но real указывает на внутренний буфер внутри std::string, который уже был уничтожен, поскольку он был временным, пытаясь прочитать егоявляется неопределенным поведением и, следовательно, единственной ошибкой здесь является ваш код.


Чтобы исправить это, сохраните строку и затем запросите c_str():

auto real = (base_dir + "/index.txt");
auto bkp = (base_dir + "/index.txt.new");
remove(real.c_str());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...