Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
1

Куда утекает память

05.03.2015, 20:20. Показов 1172. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Бесполезный код проверяет время работы функции.
Память выделяется под массив и высвобождается перед выходом из функции.

Тем не менее имеет место утечка.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
long double foo1(const int64_t N){
 
        int64_t *Arr=new int64_t[N]; //Выделил память
 
        clock_t t1 = clock();
        for (int64_t i=0;i<N-1;i++) {
                Arr[i]=i+1;
                cout<<Arr[i];
        }
        clock_t t2 = clock();
        long double X = (long double) (t2-t1) / (long double)CLOCKS_PER_SEC ;; //
        delete []Arr;// высвободил память
        return X; //честно ушел
}
main
C++
1
2
3
const int64_t N=200000000;
  long double Xcout=foo1(N);
cout<<"\ncout<<Arr[i]:  "<<Xcout<<"\n";
Куда течет память???
gnu gcc 4.7.1
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2015, 20:20
Ответы с готовыми решениями:

Куда текёть память или чудеса в решете
Всем привет. Я начинаю верить в чудеса. Кто нибудь сможет доказать, что их не бывает?)))...

Резкий выход из проги: куда девается выделенная переменной память?
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, ...

Куда утекает память
Проблема такая, когда озу загружена на ~70% ОСь начинает спамить оповещения о том, что ей не...

Куда в таком простом коде утекает память?
Не пойму куда девается память в этом простом коде: For Each dir_name As String In...

8
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
05.03.2015, 20:35 2
Цитата Сообщение от daslex Посмотреть сообщение
Тем не менее имеет место утечка.
как определил?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
05.03.2015, 20:38 3
В коде утечек нет, но следовало бы убедиться, что память была выделена, объём не маленький.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
05.03.2015, 20:45  [ТС] 4
Диспетчер задач Windows ежесекундно добавляет
Пока 2 скрина делал на 2000КБ увеличилось. И продолжает расти
Миниатюры
Куда утекает память   Куда утекает память   Куда утекает память  

0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
05.03.2015, 20:49 5
Пока общее количество памяти в диспетчере задач не превысило 1.5ГБ, нам тут делать нечего.
Откуда уверенность что память "утекает", и "утекает" именно в этой функции?
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
05.03.2015, 21:28  [ТС] 6
Ясно. Это не уверенность.Если была бы уверенность, я бы не вопрос задавал.
Это непонимание.
Более точная формулировка: "Тем не менее выглядит все так, словно, утекает память".

Просто в коде память выделяется. Пока она не выделится, я думал, что вывод на экран происходить не должен. Т.е. сначала выделить, потом только работать уже с массивом начнет.
Вывод на экран происходит, значит выделение прошло. (исходя из вышеизложенной логики)

я считать не умею сколько можно на ОС выделять.
У меня Win7 x64, 8ГБ DDR3

А именно об этой функции, потому что это весь код, который я смотрю.
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <ctime>
#include <stdio.h>
#include <inttypes.h>
#include <stdint.h>
 
 
using namespace std;
 
long double foo1(const int64_t N){
 
        int64_t *Arr=new int64_t[N]; //Выделил
 
        clock_t t1 = clock();
        for (int64_t i=0;i<N-1;i++) {
                Arr[i]=i+1;
                cout<<Arr[i];
        }
        clock_t t2 = clock();
        long double X = (long double) (t2-t1) / (long double)CLOCKS_PER_SEC ;; //
        delete []Arr;// высвободил
 
        for (int64_t i=0;i<N;i++) delete &Arr[i];
        return X; //честно ушел
}
 
 
 
int main()
{
 
    const int64_t N=200000000;
   long double Xcout=foo1(N);
   cout<<Xcount;
    return 0;
}

________________________
Эти суждения ведут меня к мысли, что диспетчер задач так работает? Волнами накатывает?

Добавлено через 25 минут
или это компилятор выделяет память небольшими кусочками.

вопрос видоизменился. Я понял, что ждать надо. И верю, что утечки нет.
Но что здесь творится-то?
диспетчер по 50Кб добавляет на каждую проверку
или компилятор выделяет память по 50Кб
(50Кб - это приблизительная цифра, на которую ежесекундно изменяется память в диспетчере)
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
05.03.2015, 22:03 7
C++
1
for (int64_t i=0;i<N;i++) delete &Arr[i];
че за?

Скомпилировал этот код Win 8.1 16Gb ОЗУ i7 -
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <ctime>
#include <stdio.h>
#include <inttypes.h>
#include <stdint.h>
 
 
using namespace std;
 
long double foo1(const int64_t N){
 
    int64_t *Arr = new int64_t[N]; //Выделил
 
    clock_t t1 = clock();
    for ( int64_t i = 0; i<N - 1; i++ ) {
        Arr[i] = i + 1;
        cout << Arr[i];
    }
    clock_t t2 = clock();
    long double X = (long double)(t2 - t1) / (long double)CLOCKS_PER_SEC;; //
    delete[]Arr;// высвободил
    
    return X; //честно ушел
}
 
 
 
int main()
{
 
    const int64_t N = 20000000;
    long double Xcout = foo1(N);
    cout << Xcout;
    return 0;
}


152,9 МБ выделилось и на протяжении всей программы так.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
06.03.2015, 00:26  [ТС] 8

Не по теме:

rikimaru2013, Может просто успела закончится до того момента когда диспетчер догнал сколько выделено.



Диспетчер Windows - тормоз, короче. Считает гигантскую память какими-то мизерными огрызками. (
Называется это рабочим множеством. Определяет, сколько памяти требуется процессу в определенный интервал времени
https://ru.wikipedia.org/wiki/Working_Set

_________________________

Я не фига не понимаю, почему каждую секунду (или точнее на каждом интервале). Происходят такие незначительные изменения если в программе указано, что требуется 1 566 032K байт.
Цитата Сообщение от castaway Посмотреть сообщение
Пока общее количество памяти в диспетчере задач не превысило 1.5ГБ, нам тут делать нечего
Этот вопрос уже и не С++ совсем. Я его Не там задал, Я здесь не то спросил, получается.
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
06.03.2015, 09:14 9
Проверку утечки памяти я делаю так:
Добавляю к проекту файл, содержащий такой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#if defined(_DEBUG) 
#include <crtdbg.h>
class CDumbDebugDummy
  {
    public:
      CDumbDebugDummy ();
  };
 
static CDumbDebugDummy g_mmmDummy;
 
CDumbDebugDummy::CDumbDebugDummy ()
  {
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | 
                    _CRTDBG_CHECK_ALWAYS_DF | 
                    _CRTDBG_DELAY_FREE_MEM_DF | 
                    _CRTDBG_LEAK_CHECK_DF        );
  }
#endif
Тогда по завершении программы в окно сообщений отладчик выдаст информацию о всех
блоках, где была утечка памяти.
5
06.03.2015, 09:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.03.2015, 09:14
Помогаю со студенческими работами здесь

Куда утекает память при копировании изображения в буфер обмена
В цикле Repeat копирую изображение в буфер обмена. Вроде освобождаю, но количество памяти...

Не понимаю, куда утекает память при заупске процесса, хотя все free
Пишу Shell в си коде. Вводится строка, ее разбиваю на слова и заношу все это в двумерный...

Куда "утекает" память или верить ли Диспетчеру задач?
Помогите разобраться, плз: в приложении некоторые данные загружаются из базы mysql, используется...

Куда утекает трафик?
Здравствуйте! У меня очень серьезная проблема. Я, в силу обстоятельств, пользуюсь сейчас только...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru