Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75

Утечка памяти. class my_array

22.02.2018, 21:50. Показов 1558. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Не могу понять, где происходить утечка памяти в коде, прошу помощи! Реализую класс my_array с конструкторами дефолтным, копирования, перемещения, операторами присваивания и т.п. Также прошу Вас высказать замечания по моему коду
Заранее благодарю. Прилагаю скрин valgrinda
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <assert.h>
#include <algorithm> // std::copy
#include <cstddef> // size_t
#include <iostream>
 
template<typename T>
class Array
{
public:
  // (default) constructor
  Array(const size_t size = 0)
    : m_size(size)
    , m_array(m_size ? new T[m_size]() : nullptr)
  {
 
  }
    //my copy constructor
    Array(const Array & Arr) : m_size(0), m_array(nullptr)
    {
        if (Arr.m_size == 0)
        {
            assert(Arr.m_array == nullptr);
            return;
        }
        m_size = Arr.m_size;
        m_array = new T[m_size];
        for (size_t i = 0; i != m_size; i++) m_array[i] = Arr.m_array[i];
        //  std::copy(Arr.m_array, Arr.m_array + m_size, m_array);
    }
 
  //my move constructor
  Array(Array && Arr) : m_size(0), m_array(nullptr)
  {
        if (Arr.m_size == 0)
        {
            assert(Arr.m_array == nullptr);
            return;
        }
        m_size = Arr.m_size;
        m_array = Arr.m_array;
        Arr.m_size = 0;
        Arr.m_array = nullptr;
  }
   
  //my swap
  void swap(Array & Arr)
  {
      std::swap(m_size, Arr.m_size);
      std::swap(m_array, Arr.m_array);
  }
 
  //my operator =
  Array & operator = (Array const& Arr)
  {
      if (this != &Arr) Array(Arr).swap(*this);
      return *this;
  }
  
 
/*  Array & operator = (Array const& Arr)
  {
      if (this != &Arr)
      {
          delete [] m_array;
          m_size = Arr.m_size;
          m_array = new T[m_size];
          std::copy(Arr.m_array, Arr.m_array + m_size, m_array);
      }
  }
 
  Array & operator = (Array const& Arr)
  {
        if (this != &Arr)
        {
            T * new_array = new T[Arr.m_size];
            std::copy(Arr.m_array, Arr.m_array + Arr.m_size, new_array);
            delete [] m_array;
            m_array = new_array;
            m_size = Arr.m_size;
        }
        return *this;
  }*/
    
  Array & operator = (Array&& Arr)
  {
      destroy();
      m_size = Arr.m_size;
      m_array = Arr.m_array;
      Arr.m_array = nullptr;
      return *this;
  }
  
  const size_t size() const
  {
    return m_size;
  }
 
  T& operator [](const size_t index)
  {
    assert(index < m_size);
 
    return m_array[index];
  }                                       
  
      ~Array() {destroy();}
  void out()
  {
    for (size_t i = 0; i != m_size; i++)
        std::cout << m_array[i] << " ";
    std::cout << std::endl;
  }
 
private:
    void destroy() 
    { 
        if (m_size)
        {
            delete[] m_array;
      m_size = 0;
            return;
        }
    }
  size_t m_size;
  T* m_array;
};
 
int main()
{
    Array<int> arr1(10);
    //Array<int> arr2(arr1);
    //Array<int> arr3 = arr2;
    //arr1.out(); arr2.out(); arr3.out();
}
Миниатюры
Утечка памяти. class my_array  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.02.2018, 21:50
Ответы с готовыми решениями:

Утечка памяти в
Кто подскажет плиз. Тут у меня утечка памяти foreach (var file in xpsFiles) { ...

Утечка памяти
Доброго времени суток, форумчане. Помогите справиться с утечкой памяти, не понятно где зараза засела. Это класс представления числа в СОК...

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

25
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
22.02.2018, 21:57
C++
1
, m_array(m_size ? new T[m_size]() : nullptr)
А этот объект вы как уничтожать будете?
1
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75
22.02.2018, 21:58  [ТС]
деструктором не уничтожится?
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
22.02.2018, 21:59
Цитата Сообщение от bikovbiv Посмотреть сообщение
деструктором не уничтожится?
Нет. Если через new создаете, то уничтожать надо руками.
0
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75
22.02.2018, 22:01  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
  ~Array() {destroy();}
 
 void destroy() 
    { 
        if (m_size)
        {
            delete[] m_array;
      m_size = 0;
            return;
        }
    }
так не пойдет?

Добавлено через 29 секунд
не видел предыдущего сообщения
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
22.02.2018, 22:02
Цитата Сообщение от bikovbiv Посмотреть сообщение
так не пойдет?
Тут вы уничтожаете массив, расположенный по указателю m_array. А у вас еще помимо этого есть T[m_size](), которые тоже надо уничтожить, раз создаете.
0
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75
22.02.2018, 22:06  [ТС]
не подскажите,как это можно сделать, я что-то туплю
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
22.02.2018, 22:12
bikovbiv, хотя может и не в этом проблема, там указатель вроде передается, чудным способом просто. А вы уверены, что у вас есть утечка памяти? Я зациклил вашу программу и у меня вроде не наблюдается утечки.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.02.2018, 22:21
При присваивании старую память нужно освобождать.
1
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75
22.02.2018, 22:24  [ТС]
эту программу я отправляю на проверку в систему, и мне пишут, что возможна утечка памяти, а я не знаю, в каком месте она может происходит, valgrind пишет, что 2 allocs, 1 frees, это при полностью закомеченном коде кроме конструктора и деструктора, если ничего не комментировать, то на один аллок больше, как я понимаю, то что аллоков больше, говорит об утечке. значит что-то не так с дефолтным конструктором или деструктором, но я не знаю, что, может я вообще не прав

Добавлено через 32 секунды
nd2 в какой строке?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.02.2018, 22:25
Цитата Сообщение от bikovbiv Посмотреть сообщение
nd2 в какой строке?
В операторе присваивания.
0
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75
22.02.2018, 22:28  [ТС]
nd2, у меня в первом закомментированном операторе присваивания так все проиходит, просто я и его пробывал, но утечка все равно была
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
22.02.2018, 22:30
Цитата Сообщение от bikovbiv Посмотреть сообщение
2 allocs, 1 frees
Я думаю оно просто не может переварить конструкцию, которую я не сразу переварил.

Добавлено через 1 минуту
nd2, там перед присваиванием вызывается destroy(), который очищает предыдущие данные.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.02.2018, 22:31
Цитата Сообщение от bikovbiv Посмотреть сообщение
у меня в первом закомментированном операторе присваивания так все проиходит, просто я и его пробывал, но утечка все равно была
Какой смысл правильный вариант убирать, а не правильный оставлять?

Добавлено через 33 секунды
Цитата Сообщение от QuakerRUS Посмотреть сообщение
там перед присваиванием вызывается destroy(), который очищает предыдущие данные.
Это в одном из вариантов оператора, в другом нет.
0
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75
22.02.2018, 22:32  [ТС]
QuakerRUS,
C++
1
2
3
4
5
  Array(const size_t size = 0)
    : m_size(size)
    , m_array(m_size ? new T[m_size] : nullptr)
  {
  }
я честно сам ее не понял, этот конструктор изначально был в задании, я сейчас убрал скобочки после T[size] , но ничего не изменилось
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
22.02.2018, 22:34
nd2, в каком? Не вижу пока.

bikovbiv, скобки не обязательны там.
0
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75
22.02.2018, 22:35  [ТС]
nd2, Эта реализация была представлена в одном онлайн-курсе и она мне понравилась лаконичностью, но я тоже сомневался насчет очистки памяти

Добавлено через 37 секунд
QuakerRUS, а в чем проблема?
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
22.02.2018, 22:41
bikovbiv, пока только вижу проблему в несовершенности проверки утилиты. Но вообще конечно код не самый интуитивно понятный.

Добавлено через 4 минуты
bikovbiv, кстати, а с чего вы взяли, что вам вообще об ошибках сообщают? Судя по тексту, он просто посчитал количество new и delete в коде.
0
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75
22.02.2018, 22:50  [ТС]
QuakerRUS, я слушал на ютюбе парня и он сказал что валгринд должен показывать одинаковое количество аллоков и фри
+ еще есть still reachable: 18,944 bytes in 1 blocks

Добавлено через 42 секунды
валгринд первый раз открыл, так что в нем не разбираюсь пока что

Добавлено через 3 минуты
Still reachable обычно означает, что valgrind нашел указатель на начало не освобожденного блока памяти, что во многих случаях связано с выделением глобальных переменных и т.п. вещей.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
22.02.2018, 22:51
bikovbiv, а этот код сколько даст количество аллоков и фри?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class MyClass
{
public:
    MyClass()
    {
        m = new int[5];
    }
    MyClass(int a)
    {
        m = new int[5];
    }
    ~MyClass()
    {
        delete[] m;
    }
private:
    int *m;
};
 
int main()
{
    MyClass m;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.02.2018, 22:51
Помогаю со студенческими работами здесь

Утечка памяти
Подскажите, где здесь может возникать утечка памяти? Вроде везде, где можно - чищу... ///////////////////////////////////// // It's...

Утечка памяти
Либо я себе мозг запудрила, либо помогите мне :) есть у меня вектор vector&lt;char*&gt; names_variable; дополняю его таким образом ...

Утечка памяти
Здравствуйте! Возникает проблема при очистке дин.памяти. Помогите, найти ошибку((( ......... double *str=new double; double...

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

Утечка памяти
Доброго времени суток. Написал оконное приложение. Столкнулся с проблемой - утекает память. Какие есть средства, чтобы определить,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru