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

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

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

Есть ли утечка памяти в этом случае? - C++

01.06.2013, 19:20. Просмотров 1051. Ответов 28
Метки нет (Все метки)

_Доброго денёчка всем. Прохожу тему на указатели и ссылки. Делаю упражнение на тему "написать программу, вызывающую утечку памяти". Смысл идеи "учись на ошибках и запомни как делать не нуна, а то будет ай-ай-ай".
В книге приведён пример такой логической ошибки, когда в функции выполняется создание экземпляра класса, для которого оператором new в функции выделяется память. Затем ссылка на объект передаётся в main для дальнейших издевательств..
_Ну вот я нечто в этом роде и написал. А потом малость подправил, и теперь не уверен, что в моем коде есть утечка памяти. Помогите, корифеи, Христа ради.

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
 // Логическая ошибка, приводящая к утечке памяти.
#include <iostream>
using namespace std;
 
class Detail
{
public: Detail (int length, int width);
        ~Detail ();
        int GetLength() const { return itsLength; }
        int GetWidth() const { return itsWidth; }
        void SetLength (int length) { itsLength = length; }
        void SetWidth (int width) { itsWidth = width; }
private:
    int itsLength;
    int itsWidth;
};
 
Detail::Detail (int length, int width)
{
    cout << " Calling constructor...\n";
    itsLength = length;
    itsWidth = width;
}
 
Detail::~Detail()
{
    cout << " Calling destructor...\n";
}
 
Detail & MakeDetail ();
 
int main()
{
    cout << "\n\n";
    Detail Det1(600, 510);
    cout << " Det.1 Length: " << Det1.GetLength() << " mm.\n";
    cout << " Det.1 Width: " << Det1.GetWidth() << " mm.\n";
    cout << "\n";
    Detail Det2 = MakeDetail();  
    cout << " Det.2 Length: " << Det2.GetLength() << " mm.\n";
    cout << " Det.2 Width: " << Det2.GetWidth() << " mm.\n";
    cout << "\n\n";
    system ("pause");
    return 0;
}
 
Detail & MakeDetail ()
{
    cout << " Calling MakeDetail...\n";
    Detail * NewDetail = new Detail (0, 0);
    NewDetail->SetLength(704);
    NewDetail->SetWidth(510);
    return *NewDetail;
}
Output:

Calling constructor...
Det.1 Length: 600 mm.
Det.1 Width: 510 mm.

Calling MakeDetail...
Calling constructor...
Det.2 Length: 704 mm.
Det.2 Width: 510 mm.


Для продолжения нажмите любую клавишу . . .
Caling destructor...
Caling destructor...

Деструктор, как видите, вызывается дважды. Или таки память от *NewDetail не очищена?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2013, 19:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Есть ли утечка памяти в этом случае? (C++):

Есть ли утечка памяти? - C++
Пример добавления элемента в список. // Включение в список нового компонента void comp_in(dyn_list &amp;l, char* n, char* v) { comp*...

Есть ли утечка памяти в list - C++
Здравствуйте, форумчане, есть вопрос насчет освобождения памяти в list, каждый элемент которого представлен структурой.Хотел узнать...

Есть ли утечка памяти в проекте? И как можно это перепроверять? - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class MyArray { int *ptrarray; //массив ...

Объясните неявное преобразование в этом случае - C++
scoped_ptr p = new Object();То есть &quot;p&quot; неявно преобразовывается в указатель, но как не понятно. Это я встретил просматривая вот это. В...

Утечка памяти - C++
Доброго времени суток! Столкнулся с проблемой утечки памяти! Будь у меня маленькая программка, выловил бы легко, но в 2000 строк кода все...

Утечка памяти - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;ArrayOperation.h&quot; using namespace std; int main() { int...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13132 / 7395 / 828
Регистрация: 27.09.2012
Сообщений: 18,222
Записей в блоге: 3
Завершенные тесты: 1
01.06.2013, 19:33 #2
Сделайте еще конструктор копий и посмотрите на результаты
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
01.06.2013, 19:33 #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Хах, третий раз переписываю ответ
Скорее всего проблема есть, так как стековые и объекты из кучи разрушаются по разному, но тут у меня сомнения насчет ссылки: то есть я не уверен, что оно должно быть закорапчено, но delete вызван не будет в любом случае, те утечка есть

На самом деле здесь идеально бы пошел scoped_ptr
Croessmah
Модератор
Эксперт CЭксперт С++
13132 / 7395 / 828
Регистрация: 27.09.2012
Сообщений: 18,222
Записей в блоге: 3
Завершенные тесты: 1
01.06.2013, 19:34 #4
Цитата Сообщение от NonCFist Посмотреть сообщение
Или таки память от *NewDetail не очищена?
После завершения программы ОС сама все почистит, но не хорошо на это опираться.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
01.06.2013, 19:35 #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Сделайте еще конструктор копий и посмотрите на результаты
Здесь ссылка, то есть копирования нет
Croessmah
Модератор
Эксперт CЭксперт С++
13132 / 7395 / 828
Регистрация: 27.09.2012
Сообщений: 18,222
Записей в блоге: 3
Завершенные тесты: 1
01.06.2013, 19:38 #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от alex_x_x Посмотреть сообщение
Здесь ссылка, то есть копирования нет
Вот тут есть:
C++
1
Detail Det2 = MakeDetail();
ибо Det2 не ссылка.
gray_fox
What a waste!
1506 / 1209 / 68
Регистрация: 21.04.2012
Сообщений: 2,544
Завершенные тесты: 3
01.06.2013, 19:39 #7
Цитата Сообщение от alex_x_x Посмотреть сообщение
Здесь ссылка, то есть копирования нет
Здесь должно быть:
Цитата Сообщение от NonCFist Посмотреть сообщение
C++
1
Detail Det2 = MakeDetail();
NonCFist
0 / 0 / 0
Регистрация: 01.06.2013
Сообщений: 12
01.06.2013, 20:01  [ТС] #8
_Т. е. утечка есть, так как явно эта выделенная память в программе не очищается, да? Спасибо, значит я всё правильно натупил.

Добавлено через 3 минуты

Не по теме:

_Я пока ещё не шибко здорово усвоил тонкости передачи и возврата объектов с помощью ссылок. Вот пока на кошках тренируюсь.

Croessmah
Модератор
Эксперт CЭксперт С++
13132 / 7395 / 828
Регистрация: 27.09.2012
Сообщений: 18,222
Записей в блоге: 3
Завершенные тесты: 1
01.06.2013, 20:10 #9
Цитата Сообщение от NonCFist Посмотреть сообщение
_Т. е. утечка есть, так как явно эта выделенная память в программе не очищается, да?
Да, есть. После этого
C++
1
Detail Det2 = MakeDetail();
память, выделенная в MakeDetail остается висеть и ничто на неё не указывает, а значит нет возможности её освободить.

Вот такой main:
C++
1
2
3
4
5
6
int main()
{
    while(true)
         MakeDetail();
    return 0;
}
вот такие результаты в диспетчере задач:
Есть ли утечка памяти в этом случае?
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
01.06.2013, 20:12 #10
Croessmah, йеп, да с той стороны то не ссылка, но утечка в любом случае получается
NonCFist
0 / 0 / 0
Регистрация: 01.06.2013
Сообщений: 12
01.06.2013, 20:19  [ТС] #11
Спасибо всем за ответы. Буду курить дальше.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
01.06.2013, 20:29 #12
А зачем вообще нужна память, на которую ни что не указывает? Зачем её было выделять?
Croessmah
Модератор
Эксперт CЭксперт С++
13132 / 7395 / 828
Регистрация: 27.09.2012
Сообщений: 18,222
Записей в блоге: 3
Завершенные тесты: 1
01.06.2013, 20:30 #13
Цитата Сообщение от taras atavin Посмотреть сообщение
Зачем её было выделять?
вот ответ:
Цитата Сообщение от NonCFist Посмотреть сообщение
Прохожу тему на указатели и ссылки. Делаю упражнение на тему "написать программу, вызывающую утечку памяти".
NonCFist
0 / 0 / 0
Регистрация: 01.06.2013
Сообщений: 12
01.06.2013, 21:38  [ТС] #14
Detail & Det2 = MakeDetail();

Смыл этой строки мне непонятен... Это значит что я создаю ссылку на тип Detail и присваиваю этой ссылке другую ссылку? Поэтому я убрал амперсант перед Det2.
Croessmah
Модератор
Эксперт CЭксперт С++
13132 / 7395 / 828
Регистрация: 27.09.2012
Сообщений: 18,222
Записей в блоге: 3
Завершенные тесты: 1
01.06.2013, 21:54 #15
Цитата Сообщение от NonCFist Посмотреть сообщение
Поэтому я убрал амперсант перед Det2.
Убрали амперсанд - получили копирование и невозможность далее освободить память.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2013, 21:54
Привет! Вот еще темы с ответами:

Утечка памяти - C++
Здравствуйте. Есть программа (разбитая на функции) постоянно работающая в цикле и выводящая информацию на консоль. И получается что она...

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

утечка памяти - C++
если запустить код char *pointer = NULL; for( int i = 0; i &lt; 10; i++ ) { pointer = new char; } delete pointer; , то есть...

Утечка памяти - C++
Где я допустил ее(утечку)? #define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;string&gt; class...


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

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

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