C++
3 / 3 / 1
Регистрация: 21.10.2017
Сообщений: 121
|
|||||||||||
1 | |||||||||||
Выдаёт ошибку при динамическом выделении памяти01.10.2018, 13:50. Показов 1243. Ответов 14
В строчке
используется потенциально неинициализированная локальная переменная-указатель "p" Почему так? Как решить эту проблему?
0
|
01.10.2018, 13:50 | |
Ответы с готовыми решениями:
14
Ошибка при динамическом выделении памяти Ошибка при динамическом выделении памяти Создание исключения при динамическом выделении памяти Выравнивание при динамическом выделении памяти под массив |
1796 / 867 / 222
Регистрация: 10.02.2018
Сообщений: 3,612
|
|
01.10.2018, 14:01 | 2 |
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
01.10.2018, 14:01 | 3 |
1) Потому, что если память не сможет выделиться - p останется неинициализированным.
2) int *p = nullptr; (или в catch его занулите - но это хуже).
0
|
1796 / 867 / 222
Регистрация: 10.02.2018
Сообщений: 3,612
|
||||||
01.10.2018, 14:02 | 4 | |||||
P.S. а если так:
0
|
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
|
||||||
01.10.2018, 14:08 | 5 | |||||
А если
0
|
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
01.10.2018, 14:39 | 6 | |||||
потому что:
тут вроде по-русски написано, не? написать код по человечачьи:
0
|
C++
3 / 3 / 1
Регистрация: 21.10.2017
Сообщений: 121
|
|
05.10.2018, 23:46 [ТС] | 7 |
Серж762, Jman, работает! А почему?)) Я не знаю, что такое nullptr и что такое NULL и за что они отвечают. Объясните пожалуйста
Добавлено через 3 минуты Ну 1-ый вариант у меня обработан в исключении. Причиной недуга стал 2-ой. Поставив int*p = nullptr; всё заработало. Вопрос: почему?) В каких случаях надо ставить nullptr? Добавлено через 32 секунды avgoor, объясните пожалуйста
0
|
"C with Classes"
|
|
06.10.2018, 07:41 | 8 |
на первое время можешь считать что
nullptr это 0 или NULL . Как я понимаю, предупреждение компилятора об используемой не инициализированной локальной переменной это особенность компилятора а не стандарт, по стандарту использование не инициализированной локальной переменной это UB.Короче компилятор тебе говорит "Лучше поставь nullptr , а то будет хреново потом." Хреново это значит что ты можешь попробовать обратиться к памяти по этому указателю а там черт знает что, короче UB.В С++ у указателей может быть строго два состояния рабочий, то есть в нем храниться какой то адрес, или не рабочий, то есть содержит 0, если ты напишешь просто int* p; в нем будет содержаться мусор, мусор - не корректный адрес, а это плохо.P.S. Вот если созрел... Не следует использовать значение NULL или ноль (0) в качестве константы-указателя null; ключевое слово nullptr менее уязвимо для неправильного использования и лучше работает в большинстве случаев. Например, если для функции func(std::Pair<const char *, double>) произвести вызов func(std::make_pair(NULL, 3.14)), возникнет ошибка компилятора. Макрос NULL разворачивается в 0, поэтому вызов std::make_pair(0, 3.14) возвращает значение std::Pair<int, double>, которое невозможно преобразовать к типу параметра std::Pair<const char *, double> функции func(). Вызов func(std::make_pair(nullptr, 3.14)) успешно компилируется, поскольку std::make_pair(nullptr, 3.14) возвращает значение std::Pair<std::nullptr_t, double>, которое допускает преобразование в тип std::Pair<const char *, double>.
1
|
C++
3 / 3 / 1
Регистрация: 21.10.2017
Сообщений: 121
|
|
07.10.2018, 15:16 [ТС] | 9 |
_stanislav, вроде бы я всё понял. Т.е. получается, что какие-то компиляторы требует написания nullptr , а какие-то нет. Если не написать nullptr в том компиляторе, который это требует, то сработает ошибка. Некоторые компиляторы просят писать nullptr чтобы не происходило неопределенного поведения (UB). Я верно всё усвоил?
Добавлено через 6 минут И ещё лучше всего во всех случаях использовать nullptr, т.к. оно менее уязвимо для неправильного использования. Добавлено через 5 минут Но есть одна вещь, которую я не очень хорошо понял из того, что Вы написали. Можете привести простенький пример в коде с константой-указателем null? Я не прошу какую-то программу. Хотя бы просто как это написать в коде Я думаю это что-то вроде: const null *ptr;
0
|
Неэпический
|
|||||||||||
07.10.2018, 16:11 | 10 | ||||||||||
Стандарт не требует диагностики, но и не запрещает.
Эм... чего? Зависит от типа инициализации, которая будет применена для указателя, т.е. от того, где это объявление происходит. В коде ТС там мусор, да. Нет. Никакие не требуют. Нет. Вам же пишут в чем заключается ошибка:
p , то компилятор перестанет ругаться этими гадкими словами, но при это проблема никуда не уйдет:
nullptr , структура данного кода не позволяет нормально работать. Нет, Ваш компилятор просит писать код так, чтобы не было использования неинициализированной переменной. hoggy привел пример как написать код, чтобы такого использования не было.
0
|
_stanislav
|
07.10.2018, 23:21
Выдаёт ошибку при динамическом выделении памяти
#15
|
Не по теме: ладно
0
|
07.10.2018, 23:21 | |
07.10.2018, 23:21 | |
Помогаю со студенческими работами здесь
15
Cin.getline() не работает при динамическом выделении памяти Использование конструктора базового класса при динамическом выделении памяти Ошибка на динамическом выделении памяти Немного о динамическом выделении памяти ... Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |