C ++ Узнайте, динамическая память используется - PullRequest
3 голосов
/ 05 марта 2012

Привет и заранее спасибо за помощь.

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

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

Я искал простой способ сделать это, и я ничего не нашел.На самом деле мне нужен какой-то метод, который будет возвращать количество используемой динамической памяти.Это все.Я нашел несколько инструментов, чтобы найти утечки памяти, но я думаю, что они просто чрезмерны, для того, что мне нужно.

Я также нашел метод, чтобы найти объем памяти, используемый процессом, но я неЭто тоже не нужно.Мне просто нужно выяснить общий объем используемой памяти, как в диспетчере задач.

Я использую Virtual Studio в Windows 7. Спасибо за вашу помощь !!

РЕДАКТИРОВАТЬ

Вот именно то, что учитель попросил нас сделать (перевод с испанского):

«Каждый раз, когда выполняется операция загрузки (из текстового файла, не имеет отношения),программа должна отображать, сколько памяти доступно в куче (памяти для выделения), и сколько доступно до загрузки файла. "

Ответы [ 6 ]

3 голосов
/ 05 марта 2012

Я нашел функцию GetProcessMemoryInfo (Windows)

http://msdn.microsoft.com/en-us/library/windows/desktop/ms683219(v=vs.85).aspx

Используйте _getpid (), когда запрашивает идентификатор процесса

http://msdn.microsoft.com/en-us/library/t2y34y40.aspx

Я сам не пользуюсь Windows, но похоже, что она должна работать.

В Linux вы можете запросить / proc / PID / statm

2 голосов
/ 05 марта 2012

Как насчет того, чтобы отслеживать свою память вручную? В каждом конструкторе:

global_size += sizeof(*this);

и в каждом деструкторе:

global_size -= sizeof(*this);

Предостережения:

  • Если вы используете наследование, вам нужно убедиться, что размер объекта не учитывается несколько раз.
  • Будут учитываться только структуры, которые вы изменили с помощью приведенного выше кода, но не любые другие структуры, такие как строки или массивы (хотя, если массив содержит экземпляры вашей структуры, они будут по-прежнему считаться).

В любой момент времени global_size будет иметь объем памяти, занятый отслеживаемыми структурами.

В качестве альтернативы вы можете заменить глобальные операторы new / delete:

void* operator new(std::size_t) throw (std::bad_alloc);
void* operator new[](std::size_t) throw (std::bad_alloc);
void* operator new(std::size_t, const std::nothrow_t&) throw();
void* operator new[](std::size_t, const std::nothrow_t&) throw();
void operator delete(void*) throw();
void operator delete[](void*) throw();
void operator delete(void*, const std::nothrow_t&) throw();
void operator delete[](void*, const std::nothrow_t&) throw();

И делай в них магию подсчета памяти. См. Также Как я могу назвать оригинальный «оператор new», если я его перегрузил?

См. Также Как получить использование памяти во время выполнения в C ++?

2 голосов
/ 05 марта 2012

Вы действительно обдумываете это. Вас попросили выяснить память, которую использует ваш список . Это сумма всех узлов в вашем списке * размер каждого узла и его содержимое.

1 голос
/ 05 марта 2012

Принимая вопрос учителя как можно более буквально, вы можете сделать это, используя функцию HeapWalk . Это позволяет вам вычислять как свободное, так и используемое пространство в куче по вашему выбору (вы, вероятно, хотите использовать кучу процесса по умолчанию, см. GetProcessHeap ).

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

1 голос
/ 05 марта 2012

Вы можете перегрузить новый глобальный оператор, а также удалять и отслеживать его.

0 голосов
/ 05 марта 2012

Ну, решение вашей проблемы действительно зависит от того, что именно вас просят сделать. Существует большая разница между общим использованием памяти приложением и памятью, используемой связанным списком. Если вам нужно знать, сколько памяти использует ваш связанный список, вам нужно умножить количество узлов на размер одного узла. Вот простой пример (в C вам придется немного его настроить, чтобы сделать его совместимым с C ++):

#include <stdio.h>
#include <stdlib.h>

struct list_node {
    int data;
    /* ... other stuff ... */
    struct list_node *next;
};

int main(void)
{
    int i;
    struct list_node *list;
    struct list_node *node;

    /* Create a single linked list with 5 elements */
    node = list = malloc(sizeof(struct list_node));
    if (!node)
        abort(); /* Not enough memory */
    node->data = 0;

    for (i = 1; i < 5; ++i) {
        node->next = malloc(sizeof(struct list_node));
        if (!node->next)
            abort(); /* Out of memory */
        node = node->next;
        node->data = i;
        node->next = NULL;
    }

    /* Print a list, count a number of nodes, and estimated memory usage. */
    i = 0;
    for (node = list; node != NULL; node = node->next) {
        ++i;
        printf("Node %d\n", node->data);
    }

    printf("%d nodes use %ld bytes of memory (%ld per node).\n",
           i, i * sizeof(struct list_node), sizeof(struct list_node));

    /* TODO: Free resources... */
    return 0;
}

В этом примере было создано 5 узлов для формирования связанного списка. Таким образом, общий объем памяти, необходимый для списка, составляет 5 * sizeof(struct list_node).

Конечно, когда вы выделяете память с помощью функции malloc(), она выделяет дополнительное пространство. Например, ему нужно где-то хранить информацию, чтобы знать, сколько байтов было выделено для данного указателя, чтобы освободить его, он также заботится о выравнивании и может выделить больше места, чем необходимо, чтобы в следующий раз вы вызывали malloc() память уже будет там.

Так что если вы действительно хотите знать все эти детали, то вам нужно использовать интерфейс, специфичный для операционной системы, чтобы определить, сколько виртуальной памяти использует ваше приложение. В частности, вам нужно два числа - использование памяти до и после создания связанного списка. К сожалению, для этого не существует стандартного API. Но вот хороший Q & A, который может помочь вам обойти вашу платформу и решить эту проблему - Как определить потребление ресурсов процессора и памяти внутри процесса?

Скорее всего, ваш учитель хотел, чтобы вы сделали простую вещь. Но если вы сделаете и то, и другое - это будет для вас только плюсом.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...