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

Жор памяти - C++

Восстановить пароль Регистрация
 
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
04.07.2013, 02:07     Жор памяти #1
простой класс, так для примера. смотрю по диспетчеру, чем больше NumTurns, тем больше память, непорядок
main.cpp
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include "qwerty.h"
using namespace std;
int main()
{   qwerty q;
    std::cout << q.u[2] << "\n";
    q.free_mem();
}
qwerty.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef QWERTY_H
#define QWERTY_H
class qwerty
{    public:
        qwerty();
        virtual ~qwerty();
        int *u;
        void free_mem();
    protected:
    private:
    static const int NumTurns = 50000; // объявление константы
    int scores[NumTurns]; //
};
#endif // QWERTY_H
qwerty.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include "qwerty.h"
qwerty::qwerty()
{  u = new int[NumTurns];
for (int i=0;i<NumTurns;i++)
    {scores[i] = i;u[i] = 2*scores[i];}
}
void qwerty::free_mem()
{delete[] u;}
qwerty::~qwerty()
{free_mem();}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
04.07.2013, 02:17     Жор памяти #2
а что ты ожидал увидеть? У тебя выделяется 2 массива по 50000 элементов каждый!
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
04.07.2013, 02:22  [ТС]     Жор памяти #3
я хочу сделать так, чтобы всё удалялось,т.е. деструктор организовать, но не знаю как
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4922 / 2665 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
04.07.2013, 02:35     Жор памяти #4
Не вижу причин для утечки памяти в данном коде, вроде бы деструктор написан верно.
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
04.07.2013, 02:39  [ТС]     Жор памяти #5
чем больше NumTurns, тем больше память в диспетчере - это ведь плохо. вот я и задумался.
может
C++
1
int scores[NumTurns]
не исчезает?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4922 / 2665 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
04.07.2013, 02:42     Жор памяти #6
soican, что значит
Цитата Сообщение от soican Посмотреть сообщение
память в диспетчере
?
Если вы про память, выделяемую ОС для программы - то ничего удивительного, вы же сами требуете её под массивы.
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
04.07.2013, 02:53  [ТС]     Жор памяти #7
а про какую память можно ещё говорить, оперативную...ну требую, а потом перестаю требовать, и хочу освободить...если б там не 50000 было, а 50000000
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.07.2013, 02:58     Жор памяти #8
Цитата Сообщение от soican Посмотреть сообщение
может Код C++
1 int scores[NumTurns]
не исчезает?
Почему он должен исчезнуть?

Добавлено через 2 минуты
Цитата Сообщение от soican Посмотреть сообщение
а потом перестаю требовать, и хочу освободить..
Сами можете освободить только то, что сами и выделили. Память, на которую u указывает - можете, под scores - нет.
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
04.07.2013, 21:16  [ТС]     Жор памяти #9
то есть статические массивы это зло... в принципе я нашёл способ? через функцию когда обращаешься, то без проблем: память не "жрётся"
C++
1
2
3
4
void helo()
{   qwerty q ;
     cout << q.u[45] <<  endl;
}
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
04.07.2013, 21:29     Жор памяти #10
если память в диспетчере не уменьшается - это еще не значит, что она занята.
система может не забирать ее у процесса до тех пор, пока она действительно не понадобится
другим приложениям. а вот если понадобится этому же, то выделение пройдет быстрее.
есть на эту тему даже теория, согласно которой, если вы запросили n памяти, то очень вероятно
вам вскоре понадобится n*x. по этим же причинам у вектора как правило емкость больше, чем
количество элементов. что-бы однозначно говорить об утечках - нужно использовать специальные
инструменты.
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
04.07.2013, 21:34  [ТС]     Жор памяти #11
Цитата Сообщение от DU Посмотреть сообщение
нужно использовать специальные
инструменты
скажи какие? я хочу с этой темой серьёзно разобраться
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
04.07.2013, 21:39     Жор памяти #12
ключевые слова типа: memory leak detection c++
поисковик поможет
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4922 / 2665 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
05.07.2013, 00:21     Жор памяти #13
Цитата Сообщение от soican Посмотреть сообщение
скажи какие? я хочу с этой темой серьёзно разобраться
valgrind
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
05.07.2013, 20:20  [ТС]     Жор памяти #14
Цитата Сообщение от MrGluck Посмотреть сообщение
valgrind
мне для windows

Добавлено через 5 часов 51 минуту
отпишусь, может кому понадобится.
скачал щяс Dr. Memory с https://code.google.com/p/drmemory/ (там же документация как пользоваться)
провел пробный тест для:
C++
1
2
3
4
5
6
int main()
{char *pointer = 0;
 for( int i = 0; i < 10; i++ )
   pointer = new char[100];
delete [] pointer;
}
появился лог с указанием кучи всякой инфы, но самое главное - с указанием строчки, где происходит утечка памяти(pointer = new char[100]; )
svk2140
-8 / 0 / 1
Регистрация: 04.07.2013
Сообщений: 254
05.07.2013, 20:25     Жор памяти #15
ну ты же выделяешь память для массива сразу 50к!!! (50 000) сделай постепенную выдачу, использование, удаление памяти
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2013, 20:32     Жор памяти #16
C++
1
2
3
4
5
6
7
8
int main()
{char *pointer = 0;
  for( int i = 0; i < 10; i++ )
 {
    pointer = new char[100];
    delete [] pointer;
 }
}
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
06.07.2013, 00:00  [ТС]     Жор памяти #17
эти примеры в большей степени экспериментальные, для того, чтобы понять, как память расходуется, в каких ситуациях бывают утечки и какими средствами их находить. В коде
C++
1
2
3
4
5
6
int main()
{char *pointer = 0;
 for( int i = 0; i < 10; i++ )
   pointer = new char[100];
delete [] pointer;
}
была специально допущена утечка, чтобы посмотреть, как dr.memory её обнаружит
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
06.07.2013, 00:15     Жор памяти #18
А там только строка кода указывается , объема утечки нет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2013, 12:07     Жор памяти
Еще ссылки по теме:

Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? C++
О памяти C++
Контроль памяти C++

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

Или воспользуйтесь поиском по форуму:
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
06.07.2013, 12:07  [ТС]     Жор памяти #19
по поводу байтов вот часть лога:
DUPLICATE ERROR COUNTS:
Error # 2: 9
SUPPRESSIONS USED:
ERRORS FOUND:
0 unique, 0 total unaddressable access(es)
...
1 unique, 9 total, 900 byte(s) of leak(s)
1 unique, 1 total, 104 byte(s) of possible leak(s)
ERRORS IGNORED:
Yandex
Объявления
06.07.2013, 12:07     Жор памяти
Ответ Создать тему
Опции темы

Текущее время: 17:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru