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

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

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

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

11.08.2011, 22:21. Просмотров 1243. Ответов 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 ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
AzaKendler
214 / 116 / 9
Регистрация: 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
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 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
Net_Wanderer
235 / 208 / 19
Регистрация: 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
AzaKendler
214 / 116 / 9
Регистрация: 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
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
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
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.08.2011, 15:07 #21
Почему-то никто не написал, что для сравнение си-строк надо использовать стандартную strcmp. Посему спешу исправить это недоразумение))
P.S. Или я не заметил, и кто-то написал? Или автору не строки надо сравнивать? Что-то я запутался...
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
12.08.2011, 15:09 #22
silent_1991, ну на это, как бы, намекали А Net_Wanderer использовал её в своём примере.
1
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
12.08.2011, 15:16  [ТС] #23
grizlik78, спасибо. но рассмотри пожалуйста мой пример.
для сравнения строк надо конечно strcmp. Я так понимаю этот кусок моего кода это вообще пример того как НЕ надо делать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char* a = "BLACK";
char* b = "BLACK";
 
throw(a);
 
 
 
catch(char* K)
{
 
if(K=="BLACK")//здесь поясни плиз что происходит. пойман указатель а. но с чем он сравнивается?
{                  //что такое "BLACK"  в данном контексте? можно ли вообще так сравнивать?
                   //это я сравниваю указатель со строковым литералом? т.е. вообще ерунда //              
//получается? и результат неопределен? студия дала тру. но я так понимаю это случайность?
 
 
}
 
 
}
Добавлено через 3 минуты
что называется дал маху. хорошо есть опытные люди на форумах. а то так и думал бы я что все ок
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
12.08.2011, 15:17 #24
Гарантировать true нельзя. Сравниваются здесь указатели. Компилятор встретив три раза "BLACK" вправе разместить эту константную строку в памяти только один раз. В этом случае значения a и b будут однинаковыми, а сравнение даст true. Но компилятор никто не заставляет экономить память и он может разместить эту строку в памяти 3 раза. Тогда значения a и b будут разными (то есть они указывают на одинаковые строки, но расположенные в разной области памяти). Сравнение в этом случае даст false.
1
silent_1991
12.08.2011, 15:22
  #25

Не по теме:

grizlik78, чорд, значит, всё-таки проглядел))

0
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
12.08.2011, 15:26  [ТС] #26
так будет правильно?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define BLACK 1
#define RED 2
 
throw(BLACK);
 
 
catch(int a)
{
 
if(a==BLACK)
{
 
}
 
}
ну или как Валерий писал
0
ISergey
Maniac
Эксперт С++
1374 / 885 / 52
Регистрация: 02.01.2009
Сообщений: 2,658
Записей в блоге: 1
12.08.2011, 15:36 #27
Если сильно охото строки, то
C++
1
2
3
std::string str("Hello");
 
if(str == "Hello") ...
0
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
12.08.2011, 15:51 #28
Цитата Сообщение от AzaKendler Посмотреть сообщение
ну или как Валерий писал
Лучше так, это же C++ в нем макросы не преветствуются
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2011, 15:51
Привет! Вот еще темы с ответами:

Вопрос про __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, 15:51
Ответ Создать тему
Опции темы

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