Nano Hash - криптовалюты, майнинг, программирование

Удаление указателя на автоматическую переменную

Пожалуйста, посмотрите на этот код

int i = 10;                                     //line 1 
int *p = &i;                                    //line 2  
delete p;                                       //line 3 
cout << "*p = " << *p << ", i = " << i << endl; //line 4  
i = 20;                                         //line 5  
cout << "*p = " << *p << ", i = " << i << endl; //line 6  
*p = 30;                                        //line 7
cout << "*p = " << *p << ", i = " << i << endl; //line 8  

Каков результат этого кода? Особенно строки 3, 5 и 7? Они вызывают неопределенное поведение? Что будет на выходе?

РЕДАКТИРОВАТЬ: я попытался запустить его с помощью g++, и он компилируется и работает нормально! Я использую MinGW в Windows 7.

Что стандарт говорит в этом контексте?


  • ты пробовал запустить? может быть, вы можете добавить результат вашего пробега, и мы можем обсудить это тогда? 03.12.2010
  • Почему бы не скомпилировать и посмотреть? Я получаю segfault ... 03.12.2010
  • *** error for object 0x7fff5fbff5ec: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug во время его запуска... скомпилировано с помощью g++ 4.1 в MacOS X. По моему определению запуска, он не работает нормально. 03.12.2010

Ответы:


1

Вы можете удалить только указатель, если вы когда-либо выделяли его динамически с помощью new. В этом случае вы не выделили указатель с помощью new, а просто определили и инициализировали его, чтобы он указывал на локальную переменную типа int.

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

03.12.2010
  • Память должна выделяться не только динамически, она должна выделяться только с помощью new. 03.12.2010

  • 2

    delete p; является UB, поэтому любое дальнейшее поведение нельзя предсказать или положиться на него. Ваша программа может немедленно рухнуть, или потратить все ваши деньги, или просто выйти из main() и сделать вид, что ничего не произошло.

    03.12.2010

    3

    Строка 3 определенно имеет неопределенное поведение, поскольку вы пытаетесь удалить память по адресу, который не находится в куче.

    03.12.2010
  • почему за это проголосовали, если он говорит то же самое, что и тот, за который проголосовали? 05.12.2010
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..