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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Определить число нулей и единиц в массиве http://www.cyberforum.ru/cpp-beginners/thread887546.html
диапазон изменения значений элементов массива 0 или 1 Сделать два варианта программы: -элементы массива задаются пользователем -заполняются с помощью генератора случайных чисел
C++ Определить число нулей и единиц в массиве диапазон изменения значений элементов массива 0 или 1 Сделать два варианта программы: -элементы массива задаются пользователем -заполняются с помощью генератора случайных чисел http://www.cyberforum.ru/cpp-beginners/thread887541.html
C++ Какую роль выполняют идентификаторы в приведенном коде?
Подскажите пожалуйста,какие в данной задаче идентификаторы и их назначение в ней. #include <iostream> #include <algorithm> #include <vector> #include <iterator> #include <cassert> using namespace std; int main()
Ошибка в функции (function: должна возвращать значение) C++
ребят, компилятор выдает error C4716: function: должна возвращать значение что это значит? как с этим бороться? #include "stdafx.h" #include <math.h> #include <string.h> #include <conio.h> #include <iostream> #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <time.h>
C++ Найти количество квадратов нечётных чисел среди компонентов файла http://www.cyberforum.ru/cpp-beginners/thread887521.html
Заполнить файл 7 натуральными числами, полученными с помощью генератора случайных чисел. Найти количество квадратов нечётных чисел среди компонентов файла.
C++ Упорядочить список студентов по оценке, полученной на экзамене и распечатать его На диске имеется файл данных STUDENT.DAT. Упорядочить список студентов по оценке, полученной на экзамене по мат. анализу и распечатать его. подробнее

Показать сообщение отдельно
NonCFist
0 / 0 / 0
Регистрация: 01.06.2013
Сообщений: 12
01.06.2013, 19:20     Есть ли утечка памяти в этом случае?
_Доброго денёчка всем. Прохожу тему на указатели и ссылки. Делаю упражнение на тему "написать программу, вызывающую утечку памяти". Смысл идеи "учись на ошибках и запомни как делать не нуна, а то будет ай-ай-ай".
В книге приведён пример такой логической ошибки, когда в функции выполняется создание экземпляра класса, для которого оператором 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 не очищена?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 20:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru