214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
1

Вопрос про catch и delete

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

Author24 — интернет-сервис помощи студентам
по какой причине данная операция совершается успешно?
ведь указатель равен 0.
Миниатюры
Вопрос про catch и delete  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.08.2011, 22:21
Ответы с готовыми решениями:

Легенда про try catch
Правда ли, что при использовании try catch, код выполняется дважды (1ый раз типа создает новый...

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

моя первая плата, хедеры - вопрос про eagle или про пайку
До сих пор я паял платы на однослойных платах для прототипирования - примерно вот таких...

Вопрос про обратную связь, и про схемотехнику полумоста
Добрый день) Я сейчас делаю схему от уважаемого rost c форума http://www.psb-kots.ru/forum/ , и...

27
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
11.08.2011, 22:34 2
К нулевому указателю можно спокойно применять операцию delete. Вообще-то, даже рекомендуется обнулять указатель после применения delete на тот случай, если вдруг где-то в другом месте к этому же указателю снова применят delete.
1
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
11.08.2011, 22:35 3
Цитата Сообщение от AzaKendler Посмотреть сообщение
по какой причине данная операция совершается успешно?
ведь указатель равен 0.
По стандарту. Аргументом delete может быть нулевой указатель. В этом случае ничего не происходит.
1
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
11.08.2011, 22:57  [ТС] 4
всем спасибо не знал.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,749
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
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
12.08.2011, 09:06  [ТС] 7
браво

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

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

a = BLACK
b = RED;

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

Де дубляж. Размусольте, буду знать
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.08.2011, 09:23 8
Цитата Сообщение от AzaKendler Посмотреть сообщение
Мы имеем на входе например
a = BLACK
b = RED;
k = a - далее проверка.
k = b - далее проверка.
Де дубляж. Размусольте, буду знать
Возможно недопонял вопрос, но char* это же указатель. Соответственно сравниваем мы не строки, а указатели на них. Если указывают на одну и ту же ячейку памяти, то они равны. Иначе - не равны.
0
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
12.08.2011, 09:29  [ТС] 9
ну да. а де дубляж?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,749
12.08.2011, 10:28 10
Цитата Сообщение от AzaKendler Посмотреть сообщение
конечно Сыроежка прав
Да и я с ним здесь полностью согласен. Вы только внимательно его пост перечитайте. Я понял, что это кусок программы и догадался, что где-то раньше могло быть
C++
1
char * a = "BLACK";
Проблема в том, что если где-то дальше будет
C++
1
if ( a == "BLACK" )
совсем не факт, что сравнение будет с тем же самым строковым литералом, а не с новым, расположенным где-то в другом месте в памяти.
0
214 / 116 / 14
Регистрация: 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
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.08.2011, 11:40 12
AzaKendler, просто вот этот код
C++
1
f ( k == "BLACK" )
сравнивает не строки, а указатели на них. Т.е. даже если оба указателя указывают на одинаковые строки, но на разные ячейки памяти, то результатом этого выражения будет false.
А гарантии того, что указатели совпадут, нету.
2
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
12.08.2011, 11:46  [ТС] 13
diagon, тем более дубляж невозможен. если есть строка в памяти на которую указывает переменная то в катче -к и получит этот адрес. разве k=a для указателя не присвоит k адрес а?.Присвоит. В чем тут путаница. Только если умышленно что то придумать.
Ладно тему пора прикрыть. ответ получен а дальше уже обсуждаются отвлеченные вещи.
в конкретном случае с катчем никакая путаница кроме как умышленно созданная - невозможна
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
12.08.2011, 11:49 14
AzaKendler, я так почти и не понял ничего из того, что ты написал, хотя мне совершенно понятно то, о чём говорили easybudda, Сыроежка и diagon. Ну да ладно.
Ответь на простой вопрос.
Что подразумевалось под этой операцией:
Цитата Сообщение от AzaKendler Посмотреть сообщение
if ( k == "BLACK" )
Сравнение строк или сравнение указателей?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,749
12.08.2011, 12:14 15
AzaKendler, да уж и не знаю, как понятнее объяснить...
Если char * a = "ABC" и char * b = "ABC" это вовсе не значит, что a == b. Могут на один участок памяти указывать, могут на разные.

Добавлено через 1 минуту
Цитата Сообщение от AzaKendler Посмотреть сообщение
ответ получен а дальше уже обсуждаются отвлеченные вещи.
в конкретном случае с катчем никакая путаница кроме как умышленно созданная - невозможна
Ну дело ваше. Но если что - Вас предупреждали...
0
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
12.08.2011, 13:18  [ТС] 16
хорошо. как правильно произвести сравнение?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char* a = "black";
char* b = "red"
........
throw(a)
.........
catch(char* K)
{
 
if(K==??????? /* и как правильно сравнивать на ваш взгляд?*/)
{
 
}
 
 
}
скорее всего я как новичок чего то не понимаю. поясните плиз. Надо с чем то сравнить пойманную инфу которую бросил throw
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
12.08.2011, 13:27 17
Лучше сделать enum...
C++
1
enum Color {Black, Red,... };
и писать явно:
C++
1
throw Black;
Или объявить переменную:
C++
1
2
3
4
5
Color t;...
// -- где-то здесь конкретное присвоение t = ... 
throw t;
...
catch(Color e)...
Это чтобы не заморачиваться с указателями. И обезопасить себя от возможных проблем с равенством-неравенством указателей...
1
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
12.08.2011, 13:32 18
AzaKendler, мне кажется код лучше слов, вот две программы, откомпилируйте, вводите "hello"
и посмотрите разницу:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main()
{
    char *hello = "hello";
    char s[6];
 
    scanf("%s", s);
    if (s == hello)
        printf("Equal!\n");
 
    return 0;
}
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h>
 
#define STREQ(str1, str2) (strcmp((str1), (str2)) == 0) 
 
int main()
{
    char *hello = "hello";
    char s[6];
 
    scanf("%s", s);
    if (STREQ(s, hello))
        printf("Equal!\n");
 
    return 0;
}
1
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
12.08.2011, 13:33  [ТС] 19
ребят спасибо что подсказали.
правильно ли я понял?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char* a = "BLACK";
char* b = "BLACK";
 
 
throw(a);
 
catch(char* K)
{
 
 
if( K=="BLACK") // поведение неопределенно? a или b?
{
 
}
 
}
помогите разобраться. это какой то важный момент очень. надо понять.
некий указатель - непонятно с чем? со строкой? т.е. должно быть false?
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
12.08.2011, 14:33 20
Поясняю. Рассмотрим пример:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
using namespace std;
 
int main()
{
    char const* a = "test1";
    cout << boolalpha;
    cout << (a == "test2") << endl;
    cout << (a == "test1") << endl;
}
Что должно быть выведено в результате?
GCC выдаёт
false
true

MSVC2008 без оптимизации выдаёт
false
false

MSVC2008 с оптимизацией выдаёт
false
true

Вопрос: какое поведение правильно? Ответ: все
1
12.08.2011, 14:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.08.2011, 14:33
Помогаю со студенческими работами здесь

вопрос про Sape, про поиск площадок
Делаю поиск площалок. В каждом пункте результатов поиска есть кнопки BL и GBL. Что они значат и...

Про указатели, массивы, new/delete и красивости /* удалить/вставить в массив */
Тут много тем с вопросами &quot;удалить\вставить из\в массив&quot; Не нравились они мне, т.к. еще один...

Про утечку памяти, new, delete и функции, возвращающие указатель на структуру
О как тему назвал! Очередной вопрос от новичка. Допустим, есть код. #include &lt;cstdio&gt;...

Конструкция try catch в цикле while. Зацикливается блок catch
Здравствуйте. Столкнулся с проблемой: при попытке запихнуть в цикл конструкцию try catch -...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru