Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452

Обьект в try

02.06.2015, 13:53. Показов 2038. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня !

Заметил одну неприятную вещь.

Если обьект выходит за область try ограниченную фигурными скобками - то он исчезает.

Обьект создан в try.

________________

И еще одна неприятность .

x области try скрывает x main().

как получить из области try доступ к x main() ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
 
{
 
      int x=777;
 
 try
 
{
     int x=7;
 
}
 
}
Заранее спасибо !
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.06.2015, 13:53
Ответы с готовыми решениями:

Обьект в динамике
Всем привет ! Скажите пожалуйста , есть ли необходимость перем. х класса Miva ложить в динамическую память если обьект класса...

Невидимый обьект
Всем доброго дня ! Играясь с С++ обнаружил такое явление, что обьект можно создать невидимым Ca(); Как теперь можно использовать...

Вывести обьект из контруктора
Описание "В языке C++ оператор typeid возвращает ссылку на объект type_info, описывающий тип объекта, к которому принадлежит оператор...

32
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
03.06.2015, 16:57
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от RAFA91 Посмотреть сообщение
Скажите пожалуйста , почему я не получаю сообщение от деструктора ?
деструктор вызывается только для "сконструированных" объектов. У Вас конструктор не отработал до конца, значит объект не достроен и деструктор для него не вызовется.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
03.06.2015, 16:59  [ТС]
я волнуюсь за утечку памяти (((
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
03.06.2015, 17:00
Цитата Сообщение от RAFA91 Посмотреть сообщение
я волнуюсь за утечку памяти (((
Тогда освобождайте память там, где нужно
Используйте умные указатели
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
04.06.2015, 12:18  [ТС]
Подскажите пожалуйста , почему не работает

C++
1
2
3
4
5
 catch (...)
 
    {
        cout<<"error 2!!!"<<endl; 
    }
этот фраггиент должен вызваться из конструктора класса Array

C++
1
2
3
4
5
6
7
8
9
10
11
Array :: Array(int size) :
 
itsSize(size)
 
{
    printf("\nKONSTRUKTOR %p \n",this);
 
    if(size == 0) throw xZero ();
    
    if(size < 0) throw ;
}
скорее всего в 10 строке косяк ..

полный код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h>
#include <conio.h>
#include <iostream>
 
using namespace std;
 
class Array
 
{
 
public:
 
    Array(int itsSize);
    
    ~Array() {printf("\nDESTRUKTOR %p \n",this); }
 
    int GetitsSize() const {return itsSize;}
    
    class xZero {};
    
    private:
        
    int itsSize;
};
 
Array :: Array(int size) :
 
itsSize(size)
 
{
    printf("\nKONSTRUKTOR %p \n",this);
 
    if(size == 0) throw xZero ();
    
    if(size < 0) throw ;
}
 
int main()
 
{
 
    try
 
    {
 
    Array intArray(0);
    
    printf("\nintArray =  %p \n",&intArray);
 
    printf("\n*** %d \n",intArray.GetitsSize());
    
    }
    
    catch (Array :: xZero)
 
    {
        cout<<"error!!!"<<endl; 
    }
 
     catch (...)
 
    {
        cout<<"error 2!!!"<<endl; 
    }
 
    return 0;
}
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
04.06.2015, 12:23
C++
1
if(size < 0) throw ;
Укажите какое исключение выкидываете.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
04.06.2015, 12:23
Цитата Сообщение от RAFA91 Посмотреть сообщение
этот фраггиент должен вызваться из конструктора класса Array
Он не должен вызываться.

Бросается исключение Array::xZero, оно и обрабатывается. До этой строки:
C++
1
if(size < 0) throw ;
дело не доходит.
Тем более условие всё равно не сработает, size == 0.
1
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
04.06.2015, 12:28
Более того, throw без операнда — это повторная генерация исключения, а если в этот момент никакое исключение не обрабатывается, произойдёт аварийное завершение программы
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
04.06.2015, 12:31  [ТС]
Array intArray(-1);

теперь то должно сработать - но при этом получаю ошибочку (((

даже не ошибку , а аварийное завершение .

может надо написать что-то типа
C++
1
2
3
class xZero {};
 
throw xZero ();
???
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
04.06.2015, 12:46
RAFA91,
Цитата Сообщение от mymedia Посмотреть сообщение
Более того, throw без операнда — это повторная генерация исключения, а если в этот момент никакое исключение не обрабатывается, произойдёт аварийное завершение программы
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
04.06.2015, 13:37  [ТС]
сделал так

C++
1
2
3
4
5
6
7
8
9
10
11
Array :: Array(int size) :
 
itsSize(size)
 
{
    printf("\nKONSTRUKTOR %p \n",this);
 
    if(size == 0) throw xZero ();
    
    if(size < 0) throw xZe (); // ???????????
}
вроде работает - - но наверное не так .

Добавлено через 45 минут
******************************


переменная itsSize лежит в дин. памяти.

создаю обьект Array intArray(-5);

при вызове конструктора

C++
1
2
3
4
5
6
7
8
9
10
11
Array :: Array(int size) :
 
itsSize(new int(size))
 
{
    printf("\nKONSTRUKTOR %p %p\n",this,itsSize);
 
    if(size == 0) throw xZero ();
    
    if(size < 0) throw xZe ();
}
в перем. itsSize(new int(size)) загружаем адрес ячейки памяти, а в ячейку число -5

на экран выводится сообщение KONSTRUKTOR %p %

далее работает throw xZe (); и получаю сообщение error 2!!!

сообщение от деструктора не получаю.

Скажите пожалуйста , - ячейка памяти выделенная при иницианализации обьекта в конструкторе при этом

освобождается ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <stdio.h>
#include <conio.h>
#include <iostream>
 
using namespace std;
 
class Array
 
{
 
public:
 
    Array(int itsSize);
    
    ~Array() {printf("\nDESTRUKTOR %p \n",this); delete itsSize;}
 
    int GetitsSize() const {return *itsSize;}
    
    class xZero {};
 
    class xZe {};
    
    private:
        
    int *itsSize;
};
 
Array :: Array(int size) :
 
itsSize(new int(size))
 
{
    printf("\nKONSTRUKTOR %p %p\n",this,itsSize);
 
    if(size == 0) throw xZero ();
    
    if(size < 0) throw xZe ();
}
 
int main()
 
{
 
    try
 
    {
 
    Array intArray(-5);
    
    printf("\nintArray =  %p \n",&intArray);
 
    printf("\n*** %d \n",intArray.GetitsSize());
    
    }
    
    catch (Array :: xZero)
 
    {
        cout<<"error!!!"<<endl; 
    }
 
     catch (...)
 
    {
        cout<<"error 2!!!"<<endl; 
    }
     
     getch();
 
    return 0;
}
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
04.06.2015, 13:53
Цитата Сообщение от RAFA91 Посмотреть сообщение
Скажите пожалуйста , - ячейка памяти выделенная при иницианализации обьекта в конструкторе при этом
освобождается ?
нет, этим занимается программист. Однако будут вызваны деструкторы для созданных членов класса, поэтому можете использовать умный указатель, тогда память освободится автоматически:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <memory>
 
class A
{
public:
    A() { std::cout << "Create A:" << this << " without parameters" << std::endl ; }
    A(const A & src) { std::cout << "Copy A " << this << " to " << &src << std::endl ; }
    ~A() { std::cout << "Destroy A:" << this << std::endl ; }
} ;
 
 
class X
{
    A * p1 ;
    std::unique_ptr<A> p2 ;
public:
    X() : p1(new A()) , p2(new A())
    {
        std::cout << "Create X " << this << " without parameters" << std::endl ;
        throw 1 ;
    }
    ~X() { std::cout << "Destroy X:" << this << std::endl ; }
};
 
 
int main()
{
    try
    {
        X x ;
    }
    catch (...)
    {}
}
http://rextester.com/XHYK41125

Create A:0x2579010 without parameters
Create A:0x2579030 without parameters
Create X 0x7fff380f6490 without parameters
Destroy A:0x2579030
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
04.06.2015, 15:28  [ТС]
Скажите пожалуйста, а если к примеру сделать так ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Array :: Array(int size) :
 
itsSize(new int(size))
 
{
    printf("\nKONSTRUKTOR %p %p\n",this,itsSize);
 
    if(size == 0) 
        
    {
        delete itsSize;  //???????????????????????
 
        throw xZero ();
    }
    
    if(size < 0) 
        
    {
        delete itsSize; //???????????????????????
 
        throw xZe ();
    }
}
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
04.06.2015, 20:40
Цитата Сообщение от RAFA91 Посмотреть сообщение
Скажите пожалуйста, а если к примеру сделать так ?
Можно, но довольно трудно уследить за всем вручную.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.06.2015, 20:40

Передать в конструктор обьект
Здравствуйте, такой вопрос, у меня есть класс , в котором есть связной список, и мне нужно при создании добавить этот же обьект в связной...

Как вывести обьект с cout ?
Как вывести обьект с помощю cout ?

Абстрактные классы. Обьект в строку
Всем доброго вечера, существует следующяя ситуация.. Есть абстрактный класс в котором вирутальная функция,она должна преобразовывать...

Класс, обьект, имя, enum..
Помогите написать программу, пожалуйста! ( Visual studio 2005, 2008 C++) Задача: Создать класс &quot;товар&quot;: название, наличие...

Передача ссылки на обьект класса в функцию
Определен класс в хэддере: class List{ public: //... void Add(const List *list); //... Метод Add:


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru