Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать размер кучи? 
:(
    Опции темы
TP@MB@Y
Дата 1.8.2005, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



Хочу отследить мусор в своей проге, но не знаю как в с++ посматреть размер динамической кучи...
PM   Вверх
JackYF
Дата 2.8.2005, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



По-моему, ни в С++, ни в любом другом языке это невозможно, так как память из кучи выделяет операционная система. Физически же это может быть почти все, что угодно.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
En_t_end
Дата 2.8.2005, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



TheapStatus - была такая функция у Борланда.
PM MAIL ICQ Skype GTalk Jabber   Вверх
chaos
Дата 2.8.2005, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



в мсдне можно посмотреть раздел Memory Allocation
PM WWW   Вверх
TP@MB@Y
Дата 2.8.2005, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



JackYF
Вот как я делал на паскале:
Код

memory:=MemAvail;

   //Работа с динамической памятью

writeln('Garbege is ',memory-MemAvail,' bytes');


Т.е. функция MemAvail возвращает доступную память

chaos
MSDN у меня пока нету

En_t_end
Если была то какой модуль надо подключить?
PM   Вверх
LPBOY
Дата 2.8.2005, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Посмотел на MSDN - тебе нужны функции _Crt* из #include <crtdbg.h> (если у тебя MSVC).

Вот пример.
Код

#include <iostream>
#include <conio.h>
#include <crtdbg.h> //для _Crt* функций

int main()
{
    _CrtMemState state1, state2, diff_state; //структуры в которых будет сохраняться состояния кучи
    _CrtMemCheckpoint(&state1); //запоминаем состояние кучи в 1-й структуре
    int *pi = new int(65);      
    //delete pi;
    _CrtMemCheckpoint(&state2); //запоминаем состояние кучи в 2-й структуре
    if(_CrtMemDifference( &diff_state, &state1, &state2))//_CrtMemDifference сравнивает два состояния и
                                                         //возвращает true если была утечка
        std::cout<<"Memory leak";
    else std::cout<<"ok";
    getch();
    return 0;
}//выводит "Memory leak". Если раскомментируешь строчку delete pi, то будет выводить ok.


Все это работает только в Debug mode. В релизе расширяется в пустую инструкцию.

Цитата(TP @ 2.8.2005, 18:29)
MSDN у меня пока нету

msdn.com

Это сообщение отредактировал(а) LPBOY - 3.8.2005, 00:52
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
TP@MB@Y
Дата 3.8.2005, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



LPBOY
Спасибо!

Я немного модифицировал код:
Код

_CrtMemCheckpoint(&state2);
    if(_CrtMemDifference( &diff_state, &state1, &state2))
    {
        sprintf(mes,"Ìóñîð â ïàìÿòè: %d",diff_state.lTotalCount);
        MessageBox(0,mes,"Âíèìàíèå!",MB_OK);
    }


Выводит мусор в байтах.
PM   Вверх
Earnest
Дата 3.8.2005, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



А мусор - это что? Неосвобожденная память?
Так в режиме отладки VC и сам тебе про все memory leaks расскажет. А если правильные слова будешь в начало каждого cpp-файла вставлять, то покажет также где (файл, строка) этот указатель был выделен.
Наверняка, другие компиляторы тоже что-то подобное умеют.



--------------------
...
PM   Вверх
LPBOY
Дата 3.8.2005, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Цитата(Earnest)

А если правильные слова будешь в начало каждого cpp-файла вставлять, то покажет также где (файл, строка) этот указатель был выделен.


Очень интересно, а какие конкретно "правильные слова" вставлять надо? smile
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Earnest
Дата 3.8.2005, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



А вот какие:

Код

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


Они автоматически вставляются во все файлы, которые генерирует визард, а в те, которые ручками создаешь, можешь ручками и вставлять, а можно скриптик какой-нить написать. Еще раз повторю, это только к MSVC относится.


--------------------
...
PM   Вверх
LPBOY
Дата 3.8.2005, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Спасибо... Глянул в MSDN. А вне MFC проекта это будет работать?
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Earnest
Дата 3.8.2005, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Не знаю, не пробовала... smile Но, по идее, должно - там нет ничего от MFC, а есть только стандартный CRT.
Да вот прямо в примерчик LPBOY вставь и попробуй.
PS
На всякий случай, memory leaks смотри в панели output (или debug) после завершения программы. MessageBox тебе не покажут...

Это сообщение отредактировал(а) Earnest - 3.8.2005, 19:02


--------------------
...
PM   Вверх
LPBOY
Дата 3.8.2005, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Earnest,
Это MFC-шная фича, а не компилятора, как я понял. Макросы вызывают MFCшные функции, которые вызывают crt. В примерчик свой я вставил - ничего не произошло...

Я засомневался просто из-за того что по инету гуляет статья где один чувак мучается, перегружает глоб. опре-ры new, delete и т.д. для той же цели, что можно добиться 5-ю строчками которые ты привела smile и то же для MSVC.
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Earnest
Дата 3.8.2005, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Хм... точно ... DEBUG_NEW определено в afx.h, стало быть, MFC.
Но, однако, ищем, скажем, AfxDumpMemoryLeaks() (код-то MFC у нас есть). И что же мы находим? А вот что:
Код

BOOL AFXAPI AfxDumpMemoryLeaks()
{
    return _CrtDumpMemoryLeaks();
}

Другие функции не смотрела, но, думаю, и там примерно так же. Их там штук пять рядом с DEBUG_NEW объявлено.
Так что спиши слова и вперед. В любом случае, это проще, чем самому париться и разбираться с устройством памяти. Или подключи библиотеку MFC как static и пользуйся - жалко, что ли.
А тот чувак - ну мало ли на свете народу, которые сначала создают себе проблему, а потом героически преодолевают трудности. Да у нас вся страна такая. smile



--------------------
...
PM   Вверх
Ni@m
Дата 4.8.2005, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 11.3.2004
Где: почти Киев

Репутация: 0
Всего: 6



Сам занялся сейчас таким делом. Потому что откуда-то появились утечки.
Вот посмотри тут. Пока ничего из этого не пользовал. Посмотри тут.
--------------------
Обучение - как переливание воды из одной чашки в другую: всегда лучше, чтоб чашка со знаниями нахордилась выше.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2838 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.