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

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

22.02.2018, 21:50. Показов 1660. Ответов 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
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75
22.02.2018, 22:56  [ТС]
Студворк — интернет-сервис помощи студентам
QuakerRUS, через 2 минуты скажу

Добавлено через 3 минуты
2 аллока 1 фри,
а still reachable: 18,944 bytes in 1 blocks, что говорит что оно не зависит от программы, которую я запускаю
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
22.02.2018, 22:58
Лучший ответ Сообщение было отмечено bikovbiv как решение

Решение

bikovbiv, что и требовалось доказать. Если несколько разных конструкторов, то и new может быть больше, чем delete, так что в данном случае все нормально.
1
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75
22.02.2018, 23:04  [ТС]
Большое спасибо за потраченное время, постараюсь повозиться с программой еще или покажу преподавателю, может все ок у меня)
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
22.02.2018, 23:45
Цитата Сообщение от QuakerRUS Посмотреть сообщение
в каком? Не вижу пока.
Здесь, но тут есть освобождение старой памяти в левом операнде. Сделано через автоматический вызов деструктора для временной копии (перед этим, через swap, там окажется адрес памяти из левого операнда).
Цитата Сообщение от bikovbiv Посмотреть сообщение
C++
1
2
3
4
5
6
  //my operator =
  Array & operator = (Array const& Arr)
  {
      if (this != &Arr) Array(Arr).swap(*this);
      return *this;
  }
Цитата Сообщение от bikovbiv Посмотреть сообщение
Эта реализация была представлена в одном онлайн-курсе и она мне понравилась лаконичностью
На вкус и цвет товарищей нет. По мне, так только разбираться дольше.
0
3 / 3 / 0
Регистрация: 21.02.2016
Сообщений: 75
22.02.2018, 23:54  [ТС]
nd2, А так больше Вы не видите, где может происходить утечка?Может не совсем правильно выполен конструктор копирования или перемещения?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
23.02.2018, 00:11
Цитата Сообщение от bikovbiv Посмотреть сообщение
А так больше Вы не видите, где может происходить утечка?
Не вижу.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.02.2018, 00:11

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Сезонность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru