1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886

Допустимые операции с нулевым указателем

20.04.2015, 09:28. Показов 7555. Ответов 121
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не if (all) delete all;, а delete []all;

Не по теме:

если че, ТС не я :D
Это вырезано из другой темы (не моей) и создана как отдельная.



 Комментарий модератора 
Эта ветка была вырезана из другой темы, т.к. количество оффтопа превысило все допустимые рамки.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.04.2015, 09:28
Ответы с готовыми решениями:

Операции с указателем к char[]
Есть некая структура, например WNDCLASSA, где её члены: typedef struct tagWNDCLASSA { UINT style; WNDPROC ...

Что будет с указателем после использования операции delete?
Имеется код: #include <iostream> using namespace std; int main() { int *wtf_ptr; wtf_ptr=new int(8);

В чем разница между указателем и указателем на указатель?
int x, *p, *q; x=10; p=&x; q=p; cout<<*q; int x, *p, **q; x=10; p=&x; q=&p;

121
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
20.04.2015, 13:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ValeryS Посмотреть сообщение
и сколько компиляторов оттрасировал?
Та вот подхожу к тому что скоро буду и компилятор трассировать. Самодельный. Более толковых способов отладки чем трассировка пока что не придумали.
Цитата Сообщение от ValeryS Посмотреть сообщение
надежней чем стандарт?
Естественно. Видно построчно что прога делает при удалении NULL, какие деструкторы вызывает и с какими параметрами.

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
что означает this NULL ???
То и означает - указатель this равен 0, т.е. указывает на первую ячейку памяти.

Добавлено через 3 минуты
Цитата Сообщение от daslex Посмотреть сообщение
Не буду отрицать, что про this Никогда не равен NULL я не знаю.
А почему не знаю?
А теперь то же самое только с удалением и деструктором.
Эхо кстати тоже хорошее средство когда не доступна трассировка. Под PHP именно этот способ и пользую.
0
20.04.2015, 13:38  [ТС]

Не по теме:

Я сразу сказал. случай тяжелый :D
А это у Вас в самодельном оно предупреждений не выдавало? Вы мой вопрос проигнорировали.
Обнадежили только надежным источником информации...
Пока что Ваш надежный источник выглядит сомнительно

0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
20.04.2015, 13:40
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Не то место читаете. Они наверно не знают что this это просто скрытый параметр передаваемый функции. void Type::Method(); на самом деле Method(Type* this); и соответственно NullPointer->Method() на самом деле Method(NullPointer). вот вам и this==NULL
Удаление NULL вызовет его деструктор c this==NULL.
Выкиньте нафиг свой компилятор. Это не соответствует стандарту С++, значит на помойку.
Вызов delete на nullptr - не должен делать ничего, уж тем более не должен вызывать деструктор несуществующего объекта.
Вызов метода через 0 указатель является UB и учитывая, что программа поведет себя непредсказуемо, проверка на ноль бессмысленна.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
20.04.2015, 13:41
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
То и означает - указатель this равен 0, т.е. указывает на первую ячейку памяти.
ячейку памяти чего?
this указатель на объект класса, если this равен NULL то где находится этот объект
а если объекта нет то на что указывает this?
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Естественно.
Я правильно понимаю, что по твоему мнению, стандарт пишут под компиляторы, а не наоборот
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Более толковых способов отладки чем трассировка пока что не придумали.
расстановку брекпоинтов, отладочную печать еще для себя не открыл ?
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
20.04.2015, 13:41
Цитата Сообщение от daslex Посмотреть сообщение
А это у Вас в самодельном оно предупреждений не выдавало?
В bcc, bcc32, bcc64
кстати окошко от C++ Builder XE6
1
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
20.04.2015, 13:43
Цитата Сообщение от daslex Посмотреть сообщение
А почему не знаю?
наверно потому что это софистика
Цитата Сообщение от daslex Посмотреть сообщение
T *obj=NULL;
obj->foo();
объект то не создается

Добавлено через 44 секунды
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
C++ Builder XE6
всегда славился своим прочтением стандарта
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
20.04.2015, 13:45  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
объект то не создается
Это в ошибках есть? Я как-то не видел, но имеет смысл там этому быть. В смысле о this, потому что я вот до сих пор не знал.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
20.04.2015, 13:53
Цитата Сообщение от daslex Посмотреть сообщение
Это в ошибках есть?
не понял, в каких ошибках?
попробуй
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class T{
    public:
  void foo(){
    if (this==NULL) cout<<"OK\n";  //Выводится же. Значит this==NULL
  };
};
 
int main()
{
 
 
T *obj;
obj->foo();
 
 
}
что покажет?

кстати в таком варианте
C++
1
if(obj) delete obj;
delete сработает, правда что она удалит никто не знает


по моим наблюдением в Си( а равно в плюсах) есть две крайности, или не делают проверку там где нужно, или делают там где она бесполезна
0
20.04.2015, 13:58  [ТС]

Не по теме:

Да я о теме распр. ошибки. Наверняка встречаются такие, кто может пытаться применять такое сравнение this к NULL. Я описать этого грамотно не могу, например.

0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
20.04.2015, 14:02
Цитата Сообщение от daslex Посмотреть сообщение
Да я о теме распр. ошибки.
знаешь я об этой "ошибке" только здесь узнал
и Сергей Сергеич не приветствует обсуждения в той теме, тем более дискуссии, а вопрос то достаточно спорный
надеюсь если его заинтересует, перенесет туда
0
20.04.2015, 14:04  [ТС]

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
что покажет?
что объект не создается, наверное...

0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
20.04.2015, 14:06
Цитата Сообщение от ValeryS Посмотреть сообщение
расстановку брекпоинтов, отладочную печать еще для себя не открыл ?
А трассировка это что по твоему не расстановка брекпоинтов и пошаговое выполнение программы? Отладочная печать на втором месте по удобству/информативности.

Цитата Сообщение от ValeryS Посмотреть сообщение
ячейку памяти чего?
ОЗУ естественно. ральной или виртуальной от ос зависит, но один хрен начало таблицы векторов прерываний.
Цитата Сообщение от ValeryS Посмотреть сообщение
this указатель на объект класса, если this равен NULL то где находится этот объект
А что такое объект? Это структурированный тип данных. Где находятся данные если указатель на их начало равен NULL? код обрабатывающий эту структуру для статических методов там где был там и останется потому как работает через call и адреса кода методов зашиты в самой инструкции вызова. а вот с виртульальными получится большая бяка потому как они работают через indirect call и адреса лежат в этой структуре на которую this указывает.

Цитата Сообщение от ValeryS Посмотреть сообщение
а если объекта нет то на что указывает this?
если нету объекта то нету и this. this это скрытый параметр метода, и существует он естественно только в скопе метода. Вообще сначала в С++ никаких классов (на уровне компилятора) не было, они реализовывались средствами препроцессора. Ликбез, первый семестр.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
20.04.2015, 14:11

Не по теме:

Цитата Сообщение от daslex Посмотреть сообщение
Да я о теме распр. ошибки. Наверняка встречаются такие, кто может пытаться применять такое сравнение this к NULL. Я описать этого грамотно не могу, например.

Таблица векторов прерываний тоже может обрабатываться с помощью классов. Адрес ее начала - NULL

Добавлено через 57 секунд
Цитата Сообщение от daslex Посмотреть сообщение
, которая нервно курит в сторонке, читая ответ на свой вопрос..
Ниче, зато может поймет что такое класс, объект указатель и с чем их едят
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
20.04.2015, 14:16  [ТС]
МОжно узнать только специфические особенности, но не суть этой темы по нашим диалогам. В тем более тут слишком мало ответов на изначальные вопросы.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
20.04.2015, 14:18
Цитата Сообщение от daslex Посмотреть сообщение
В тем более тут слишком мало ответов на изначальные вопросы.
У изначальных вопросов ноги растут от непонимания того что такое указатель.

Не по теме:

А многие неизначальные от непонимания того что компьютер - машина Тюринга

0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
20.04.2015, 14:19
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
this это скрытый параметр метода,
ссылку на определение
при такой записи
C++
1
this->a =10;
какого метода какой параметр?
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Где находятся данные если указатель на их начало равен NULL?
вот я и спрашиваю?
0
20.04.2015, 14:19  [ТС]

Не по теме:

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Какая информация и каким компилятором?
предупреждения gnu gcc без каких бы-то ни было галочек на поиски ошибок. Я это уже писал.

0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
20.04.2015, 14:22
Цитата Сообщение от ForEveR Посмотреть сообщение
Вызов delete на nullptr - не должен делать ничего, уж тем более не должен вызывать деструктор несуществующего объекта.
А кто сказал что по адресу NULL не может существовать ВАЛИДНОГО объекта?
С тем же успехом можно сказать что delete не должен вызывать вообще никакие деструкторы, а тем более виртуальные, т.к. не может проверить ВАЛИДНОСТЬ объекта находящегося по переданному ему указателю.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
20.04.2015, 14:25
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Таблица векторов прерываний тоже может обрабатываться с помощью классов. Адрес ее начала - NULL
прям таки везде?
например у cortex там лежит указатель на стек
Цитата Сообщение от daslex Посмотреть сообщение
В тем более тут слишком мало ответов на изначальные вопросы.
я бы ответил если б понял вопрос
что нужно? динамический массив
массив указателей
или в выделенной памяти создать объект ( Placement new)

Добавлено через 1 минуту
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А кто сказал что по адресу NULL не может существовать ВАЛИДНОГО объекта?
стандарт
NULL это не адрес 0, а несуществующий адрес
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
20.04.2015, 14:29  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
что нужно? динамический массив
я сказал вопросов, а не вопроса. Тут изначально 3 вопроса.
1. ТС (и мало на него ответов)
2. delete [] vs delete
3. if (ptr) delete ptr;

Ну и где ответы. Как мы мимолетно и беззаботно перешли к
Цитата Сообщение от ValeryS Посмотреть сообщение
Таблица векторов прерываний тоже может обрабатываться с помощью классов. Адрес ее начала - NULL
(не ваша цитата, я ее скопипастил просто из цитаты.)

Правда, вот оно,
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А кто сказал что по адресу NULL не может существовать ВАЛИДНОГО объекта?
Предвещает ответ на третий вопрос. Вдругэта тайна покрытая мраком раскроется нашим незрячим глазам....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.04.2015, 14:29

Переделать функцию c указателем на int, на функцию с указателем на void
Есть рабочий код qsort для int: void qsort(int *base, int n) { // Прекратить если количество элементов меньше либо равно единице....

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

Перечислите операции, допустимые для переменных-массивов
Здравствуйте. Я не могу понять вопрос, имеется введу что можно делать с элементами массива? Или с самими массивами? Нашёл только,...

Перечислить допустимые операции при работе с очередью
бырее ктонить плз Добавлено через 30 минут эгээй К слову бырее: Правила п.5.1. Уважительно относитесь к другим участникам...

Хранимые процедуры (допустимые операции внутри тела)
Подскажите пожалуйста: как я понял, в хранимых процедурах запрещается выполнять операции по модификации таблиц(добавление, редактирование)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru