Время жизни указателя, указывающего на функцию c_str в std :: string - PullRequest
0 голосов
/ 04 мая 2020

Во-первых, код, указанный ниже.

#include<string>
#include<stdio.h>

int main(){

    const char *cs;
    {
        std::string s("123456");
        cs = s.c_str();
        printf("cs = %s\n",cs);
    }
    printf("cs = %s\n",cs);
    return 0;
}

, запустите его и получите следующий результат. (Linux g cc)

cs = 123456
cs = 123456

Итак, я не знаю, почему указатель cs действителен после s уничтожен. другими словами, время жизни указателя, указывающего на функцию c_str в std :: string.

Ответы [ 3 ]

3 голосов
/ 04 мая 2020

Код имеет неопределенное поведение .

Во втором printf() указатель cs по-прежнему указывает на освобожденную память. Тот факт, что вы получаете тот же вывод, просто означает, что содержимое этой памяти еще не было перезаписано. Но доступ к освобожденной памяти по-прежнему недействителен.

2 голосов
/ 04 мая 2020

Это типичная проблема использования после освобождения, часть памяти, на которую указывает cs, освобождается, но, к счастью, она еще не была возвращена ядру или повторно использована вашей программой. Поведение use-after-free не определено, и вы не должны этого делать. Это одна из самых сложных проблем. Google open sourced - это инструмент, который поможет вам обнаружить использование после освобождения в вашем коде: https://github.com/google/sanitizers/wiki/AddressSanitizer

1 голос
/ 04 мая 2020

Просто догадываюсь, но:

  • Ваша операционная система допускает более слабую политику в отношении выделения памяти. Это случилось со мной, когда я иногда работал над Windows, код, который заканчивался sigsegv на linux, хорошо работал на win.
  • Кроме того, это может зависеть от вашего компилятора, версии c ++ и так далее. Это может только потреблять ссылку и копировать по требованию. Смотрите здесь Будет ли std :: string.assign (const char *) или op = (с const char *) создавать копию char *?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...