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

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

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

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

09.07.2014, 09:36. Просмотров 329. Ответов 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;     
}
Такой вариант правильный или нет? И почему первый вариант некорректный, если всё компилируется и запускается?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2014, 09:36     Объект класса в динамической памяти
Посмотрите здесь:

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6477 / 2252 / 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
Это корректно, как ты считаешь, что у тебя выводится что-то левое?
Я могу писать почтовый клиент, а написать программу, которая отформатирует мне диск. Она будет компилироваться и запускаться. Ее можно считать корректным почтовым клиентом?
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
09.07.2014, 10:03     Объект класса в динамической памяти #3
Цитата Сообщение от lest_ Посмотреть сообщение
это надо воспринимать как "мусор"
Да. В худшем варианте он еще и некоторое время будет содержать вполне вменяемые данные.

Цитата Сообщение от lest_ Посмотреть сообщение
Такой вариант правильный или нет?
Неправильно использовать ссылку после разрушения объекта, на который она ссылается.
Ссылка - это еще одно имя того же самого объекта. Первый вариант синтаксически ошибок не содержит, ошибка в логике работы с памятью, такое компилятор обнаружить не в состоянии.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2014, 08:35     Объект класса в динамической памяти
Еще ссылки по теме:

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

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

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

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

Выделить в памяти объект класса string и присвоить ему значение - C++
Здравствуйте! Я доучился :-( Дошел до полиморфизма и сдал проект и не знаю как работать с классом string. Нужно в памяти выделить...

Удаление динамической памяти - C++
В книгах по С++ я читал про утечку памяти. Я решил создать программу, в которой будет выделаться 1 Гб памяти и не удаляться. Будучи...


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

Или воспользуйтесь поиском по форуму:
lest_
0 / 0 / 0
Регистрация: 28.11.2013
Сообщений: 94
12.07.2014, 08:35  [ТС]     Объект класса в динамической памяти #4
Цитата Сообщение от Vourhey Посмотреть сообщение
Это корректно, как ты считаешь, что у тебя выводится что-то левое?
Я могу писать почтовый клиент, а написать программу, которая отформатирует мне диск. Она будет компилироваться и запускаться. Ее можно считать корректным почтовым клиентом?
спасибо за ответ. а второй вариант (с указателем) правильно написан?
Yandex
Объявления
12.07.2014, 08:35     Объект класса в динамической памяти
Ответ Создать тему
Опции темы

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