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

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

Войти
Регистрация
Восстановить пароль
 
lest_
0 / 0 / 0
Регистрация: 28.11.2013
Сообщений: 94
#1

Объект класса в динамической памяти - C++

09.07.2014, 09:36. Просмотров 337. Ответов 3
Метки нет (Все метки)

Привет. Вот листинг:
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
#include <iostream>
using namespace std;
 
class SimpleCat
{
public:
    SimpleCat(int age, int weight)
    {
        cout << "SimpleCat Constructor..." << endl;
        itsAge = age;
        itsWeight = weight;
    }
    ~SimpleCat() { cout << "In the DESTRUCTOR" << endl; }
    int GetAge()    { return itsAge; }
    int GetWeight() { return itsWeight; }
private:
    int itsAge;
    int itsWeight;
};
 
SimpleCat& func()
{
    SimpleCat* pFrisky = new SimpleCat(5,9);
    cout << "pFrisky: " << pFrisky << endl;
    return *pFrisky;
}
 
int main()
{
    SimpleCat& rCat = func();
    int age = rCat.GetAge();
    cout << "rCat is " << age << " years old!" << endl;
    cout << "&rCat: " << &rCat << endl;
 
    // Как бы избавиться от этой памяти?
    SimpleCat* pCat = &rCat;
    delete pCat; 
    pCat = 0;
    // Ой-ой, на что же теперь ссылается rCat?
 
    cout << &rCat << endl; // выводит тот же самый адрес
    cout << rCat.GetAge() << endl; // в Visual Studio 2010 выводит число -17891602
                                   // cpp.sh выводит 0 
 
    char response; std::cin >> response; // для задержки экрана
                            
    return 0;     
}
В функции main() необходимо освободить ненужный больше участок в динамической памяти. Для этого создаём указатель, инициализируем его адресом области в динамической памяти, а затем применяем к нему оператор delete (строки 36-38). После этого не понятно, на что ссылается rCat. Строчки 41 и 42 я сам добавил. В листинге в учебнике их не было. 2 разных компилятора выводят различный возраст удалённого кота (это надо воспринимать как "мусор"?). Автор говорит, что программа некоректная. И предлагает так решить проблему: "объявить объект класса SimpleCat в области динамической памяти (в теле функции func() ), но сделать это нужно так, чтобы функция func() вщзвращала указатель на данный объект. Затем, когда объект будет уже не нужен, его следует удалить в вызывающей функции при помощи оператора delete." Код не приведён. Я сам попробовал написать:
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
#include <iostream>
using namespace std;
 
class SimpleCat
{
public:
    SimpleCat(int age, int weight)
    {
        cout << "SimpleCat Constructor..." << endl;
        itsAge = age;
        itsWeight = weight; 
    }
    ~SimpleCat() { cout << "In the DESTRUCTOR" << endl; }
    int GetAge()    { return itsAge; }
    int GetWeight() { return itsWeight; }
private:
    int itsAge;
    int itsWeight;
};
 
SimpleCat* func()
{
    SimpleCat* pFrisky = new SimpleCat(5,9);
    cout << "pFrisky: " << pFrisky << endl;
    return pFrisky;
}
 
int main()
{
    SimpleCat* pCat = func();
    int age = pCat->GetAge(); // аналогично команде: int age = (*pCat).GetAge();
    
    cout << "pCat is " << age << " years old!" << endl;
    cout << "pCat: " << pCat << endl;
 
    delete pCat; // освободили область динамической памяти 
    pCat = 0;
 
    cout << pCat << endl; // выводит на экран: 00000000
 
    char response; std::cin >> response; // для задержки экрана
                            
    return 0;     
}
Такой вариант правильный или нет? И почему первый вариант некорректный, если всё компилируется и запускается?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2014, 09:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объект класса в динамической памяти (C++):

Указатель,объект класса размещенный в динамической памяти - C++
Ребят,такой маленький нелепый вопрос. Как можно обратиться к объекту класса созданному в динамической памяти(через &quot;new&quot;)?; В моей книге...

Как создать объект класса в динамической памяти? - C++
привет. я так понял, можно создать объект в динамической области памяти. либо просто создать объект обычным способом, но чтобы его...

Классы. Объявить массив динамически и сделать указатель на объект в динамической памяти - C++
Я создал классы: ПЕРСОНА, служащий, роботодатель, инженер. Но мне нужно в программе (после int main() 69 строка) объявить массив...

Размещение класса в динамической памяти - C++
Добрый день! Интересует такой вопрос, который я никак не пойму: Есть класс class Container, который создается в динамической памяти. c...

Обращение к свойству класса в динамической памяти - C++
Здравствуйте! Возникла проблема с обращением к свойству класса, расположенному в динамической памяти. Пойду по порядку. Создаю вот...

Выделение динамической памяти под массив из класса - C++
Допустим, есть class c, и он включает в себя char-массив a: class c { private: char a; public: c(); c(char* a); }

3
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
09.07.2014, 09:58 #2
Цитата Сообщение от lest_ Посмотреть сообщение
// Ой-ой, на что же теперь ссылается rCat?
Ничего не поменялось. На ту же самую область памяти, куда и ссылался до этого.
Цитата Сообщение от lest_ Посмотреть сообщение
cout << &rCat << endl; // выводит тот же самый адрес
Так и должно быть.
Цитата Сообщение от lest_ Посмотреть сообщение
cout << rCat.GetAge() << endl; // в Visual Studio 2010 выводит число -17891602
* * * * * * * * * * * * * * * * * *// cpp.sh выводит 0
Все, что угодно может вывести, или, например, упасть с ошибкой доступа в "лучшем" случае. Зависит от реализации стандартной библиотеки, и от кода самой программы.

Добавлено через 3 минуты
Цитата Сообщение от lest_ Посмотреть сообщение
И почему первый вариант некорректный, если всё компилируется и запускается?
Даже не вдаваясь в объяснения, ты же сам написал:
Цитата Сообщение от lest_ Посмотреть сообщение
// в Visual Studio 2010 выводит число -17891602
* * * * * * * * * * * * * * * * * *// cpp.sh выводит 0
Это корректно, как ты считаешь, что у тебя выводится что-то левое?
Я могу писать почтовый клиент, а написать программу, которая отформатирует мне диск. Она будет компилироваться и запускаться. Ее можно считать корректным почтовым клиентом?
1
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
09.07.2014, 10:03 #3
Цитата Сообщение от lest_ Посмотреть сообщение
это надо воспринимать как "мусор"
Да. В худшем варианте он еще и некоторое время будет содержать вполне вменяемые данные.

Цитата Сообщение от lest_ Посмотреть сообщение
Такой вариант правильный или нет?
Неправильно использовать ссылку после разрушения объекта, на который она ссылается.
Ссылка - это еще одно имя того же самого объекта. Первый вариант синтаксически ошибок не содержит, ошибка в логике работы с памятью, такое компилятор обнаружить не в состоянии.
1
lest_
0 / 0 / 0
Регистрация: 28.11.2013
Сообщений: 94
12.07.2014, 08:35  [ТС] #4
Цитата Сообщение от Vourhey Посмотреть сообщение
Это корректно, как ты считаешь, что у тебя выводится что-то левое?
Я могу писать почтовый клиент, а написать программу, которая отформатирует мне диск. Она будет компилироваться и запускаться. Ее можно считать корректным почтовым клиентом?
спасибо за ответ. а второй вариант (с указателем) правильно написан?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2014, 08:35
Привет! Вот еще темы с ответами:

Утечка памяти при создании динамической переменной класса - C++
Никак не могу исправить проблему утечки памяти при создании динамической переменной класса class Ship { private: int maxHeight; ...

Двумерный массив в динамической памяти как поле класса - C++
Здравствуйте! Вот так можно описать двумерный массив в дин.памяти. class nameClass { public: MapPlaceTp ** roomMap; ...

4 раза в памяти создается объект класса - C++
Доброго времени суток! Есть следующий код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; ...

Динамическое выделение памяти под объект класса - C++
Помогите динамически выделить память под объект класса.


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

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

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