Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
#1

Вопрос про catch и delete - C++

11.08.2011, 22:21. Просмотров 1242. Ответов 27
Метки нет (Все метки)

по какой причине данная операция совершается успешно?
ведь указатель равен 0.
0
Миниатюры
Вопрос про catch и delete  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2011, 22:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос про catch и delete (C++):

Расскажите про new и delete в C++ - C++
Есть несколько вопросов: 1) Можно ли перегрузить несколько операторов new в разных пространствах имен, а потом просто писать int *t =...

Вопрос про getline - C++
Читая ман по getline, я наткнулся на интересный для меня момент:DESCRIPTION getline() reads an entire line from stream, storing...

Вопрос про наследование. - C++
Добрый день всем! Возможно ли создать производный класс в который будут помещены 2 объекта базового класса с возможностью...

Вопрос про указатели - C++
#include <iostream.h> int main() { int x; int *Pointer; pointer = &x; cout << pointer; cout << *ponter; return 0; ...

Вопрос про консоль - C++
День добрый. Я новичок в программировании и пишу консольную программу.Хотелось бы узнать у более опытных товарищей. Как сделать так,...

Вопрос про указатели - C++
char *a = "s"; 1. Выделяется место в памяти 2. В это место записывается s 3. Указателю a приваивают адрес памяти где храниться s ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 22:34 #2
К нулевому указателю можно спокойно применять операцию delete. Вообще-то, даже рекомендуется обнулять указатель после применения delete на тот случай, если вдруг где-то в другом месте к этому же указателю снова применят delete.
1
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
11.08.2011, 22:35 #3
Цитата Сообщение от AzaKendler Посмотреть сообщение
по какой причине данная операция совершается успешно?
ведь указатель равен 0.
По стандарту. Аргументом delete может быть нулевой указатель. В этом случае ничего не происходит.
1
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
11.08.2011, 22:57  [ТС] #4
всем спасибо не знал.
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,708
12.08.2011, 04:43 #5
Цитата Сообщение от AzaKendler Посмотреть сообщение
по какой причине данная операция совершается успешно?
C++
1
2
...
if ( k == "BLACK" )
Это кто же Вас надоумил так С-строки сравнивать? "Данная операция" скорее всего вообще не выполняется...
0
Сыроежка
Заблокирован
12.08.2011, 04:55 #6
Цитата Сообщение от easybudda Посмотреть сообщение
Это кто же Вас надоумил так С-строки сравнивать? "Данная операция" скорее всего вообще не выполняется...
Она может выполниться, если ранее был код

C++
1
k = "BLACK";
и компилятор все дублирующие строковые литералы хранит как один строковый литерал. Но естественно такое поведение программы неопределенные, так как даже с одним компилятором можно компилировать код, меняя опции компилятора.
0
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
12.08.2011, 09:06  [ТС] #7
браво

Добавлено через 2 минуты
конечно Сыроежка прав. Я привел кусок листинга который интересовал. Зачем весь код?

более того. нет никаких дублирующих литералов. throw выкидывает литералы с разными именами.
а внутри catch параметр имеет имя k. и что с того? Мы имеем на входе например

a = BLACK
b = RED;

k = a - далее проверка.
k = b - далее проверка.

Де дубляж. Размусольте, буду знать
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.08.2011, 09:23 #8
Цитата Сообщение от AzaKendler Посмотреть сообщение
Мы имеем на входе например
a = BLACK
b = RED;
k = a - далее проверка.
k = b - далее проверка.
Де дубляж. Размусольте, буду знать
Возможно недопонял вопрос, но char* это же указатель. Соответственно сравниваем мы не строки, а указатели на них. Если указывают на одну и ту же ячейку памяти, то они равны. Иначе - не равны.
0
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
12.08.2011, 09:29  [ТС] #9
ну да. а де дубляж?
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,708
12.08.2011, 10:28 #10
Цитата Сообщение от AzaKendler Посмотреть сообщение
конечно Сыроежка прав
Да и я с ним здесь полностью согласен. Вы только внимательно его пост перечитайте. Я понял, что это кусок программы и догадался, что где-то раньше могло быть
C++
1
char * a = "BLACK";
Проблема в том, что если где-то дальше будет
C++
1
if ( a == "BLACK" )
совсем не факт, что сравнение будет с тем же самым строковым литералом, а не с новым, расположенным где-то в другом месте в памяти.
0
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
12.08.2011, 11:36  [ТС] #11
easybudda, имеется ввиду область видимости автопеременных? ну конешно если я раз написал а = ... а потом еще раз объявил где то а и определил то можно и запутаться. Или если я указателю а присвоил другой литерал. НО...это не тот случай поскольку k
C++
1
2
3
4
5
6
7
catch(char* k)
{
  if ( k == "BLACK" )
  {
    ///...........
  }
}
находится внутри catch. K - это параметр catch - его переназначить можно только внутри catch, тем самым нарушив весь смысл катч в данном контексте. Ну а так катчу все равно какие там литералы я выкидываю.
Короче ситуацию Сыроега описал странную. Следуя той логике можно воротить абсолютно любые ошибки. Переназначать переменные, забывая из смысл ....ну и тд и тп.
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.08.2011, 11:40 #12
AzaKendler, просто вот этот код
C++
1
f ( k == "BLACK" )
сравнивает не строки, а указатели на них. Т.е. даже если оба указателя указывают на одинаковые строки, но на разные ячейки памяти, то результатом этого выражения будет false.
А гарантии того, что указатели совпадут, нету.
2
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
12.08.2011, 11:46  [ТС] #13
diagon, тем более дубляж невозможен. если есть строка в памяти на которую указывает переменная то в катче -к и получит этот адрес. разве k=a для указателя не присвоит k адрес а?.Присвоит. В чем тут путаница. Только если умышленно что то придумать.
Ладно тему пора прикрыть. ответ получен а дальше уже обсуждаются отвлеченные вещи.
в конкретном случае с катчем никакая путаница кроме как умышленно созданная - невозможна
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
12.08.2011, 11:49 #14
AzaKendler, я так почти и не понял ничего из того, что ты написал, хотя мне совершенно понятно то, о чём говорили easybudda, Сыроежка и diagon. Ну да ладно.
Ответь на простой вопрос.
Что подразумевалось под этой операцией:
Цитата Сообщение от AzaKendler Посмотреть сообщение
if ( k == "BLACK" )
Сравнение строк или сравнение указателей?
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,708
12.08.2011, 12:14 #15
AzaKendler, да уж и не знаю, как понятнее объяснить...
Если char * a = "ABC" и char * b = "ABC" это вовсе не значит, что a == b. Могут на один участок памяти указывать, могут на разные.

Добавлено через 1 минуту
Цитата Сообщение от AzaKendler Посмотреть сообщение
ответ получен а дальше уже обсуждаются отвлеченные вещи.
в конкретном случае с катчем никакая путаница кроме как умышленно созданная - невозможна
Ну дело ваше. Но если что - Вас предупреждали...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2011, 12:14
Привет! Вот еще темы с ответами:

Вопрос про __function - C++
вопрос глупый, но все же: зачем в названии функциях пишут две __ - void __Plus(int a); - пример int __Display(int b) это для красоты...

Вопрос про классы - C++
Такой пример. Базовый класс First, и два производных от него класса Second и Third. First*ar={new First(параметры),new Second(параметры),...

Вопрос про память... - C++
Вот скажите пожалуйста в чем разница между int *p = new int; *p = 10; и int n = 10; не могу понять )

Вопрос про Swich - C++
Пример: int i=2; switch (i) { case 1: i += 2; case 2: i *= 3; case 0: i /= 2; case 4: i -= 5; default: ; } Выполнение оператора...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.08.2011, 12:14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru