Как определить память объекта c ++ во время выполнения - PullRequest
7 голосов
/ 23 декабря 2010

Я пытаюсь определить размер объекта во время выполнения. sizeof не работает, потому что он возвращает размер во время компиляции. Вот пример того, что я имею в виду:

class Foo 
{
public:
    Foo() 
    {
        c = new char[1024*1024*1024];
    }
    ~Foo() 
    { 
        delete[] c; 
    }

private:
    char *c;
};

В этом случае sizeof(Foo) будет 4 байта, а не ~ 1 ГБ. Как я могу определить размер Foo во время выполнения? Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 23 декабря 2010

Размер Foo постоянен.~ 1 ГБ символов технически не принадлежит объекту, только указатель на него.Говорят, что символы принадлежат только объекту, поскольку объект отвечает за выделение и освобождение памяти для них.C ++ не предоставляет функций, позволяющих узнать, сколько памяти выделено для объекта.Вы должны следить за этим самостоятельно.

5 голосов
/ 23 декабря 2010

Тебе нужно как-то следить за этим.Например:

struct Foo 
{
    Foo()
        : elements(1024 * 1024 * 1024) 
    {
        c.reset(new char[elements]);
    }

    boost::scoped_array<char> c;
    int elements;
};

Обратите внимание, что вы должны использовать контейнер интеллектуальных указателей для управления динамически размещаемыми объектами, чтобы вам не приходилось управлять их временем жизни вручную.Здесь я продемонстрировал использование scoped_array, который является очень полезным контейнером.Вы также можете использовать shared_array или shared_ptr с пользовательским средством удаления.

1 голос
/ 23 декабря 2010

Размер объекта составляет 4 байта в вашей системе. Однако объект использует дополнительные ресурсы, такие как 1 ГБ памяти.

...