Где именно в памяти находится количество выделенной памяти, используемой при удалении? - PullRequest
5 голосов
/ 05 июня 2011
int* Array;

Array = new int[10];

delete[] Array;

delete знает количество выделенной памяти.Я гуглил, что он хранит его в памяти, но зависит от компилятора.Есть ли в любом случае, чтобы получить этот счет?

Ответы [ 7 ]

4 голосов
/ 05 июня 2011

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

Однако, как сказал Бен, при определенных обстоятельствах реализация знает, сколько объектов находится в массиве, чтобы можно было вызывать их деструкторы.

2 голосов
/ 05 июня 2011

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


Один из способов управлять ими всеми

Однако вы можете сохранить его заранее:

int* Array;
size_t len = 10;
Array = new int[len];
delete[] Array;

Пользовательский class

Если вам это не нравится, вы можете создать свой собственный class:

class IntArray
{
public:
    int* data;
    size_t length;
    IntArray(size_t);
    ~IntArray();
};

IntArray::IntArray(size_t len)
{
    length = len;
    data = new int[len];
}

IntArray::~IntArray()
{
    length = 0;
    delete data;
    data = NULL;
}

std :: vector

Я рекомендую использовать метод std::vector:

std::vector<int> Array (10, 0);

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

for(size_t i = 0; i < Array.size(); ++i)
    Array[i] = i;
2 голосов
/ 05 июня 2011

Не существует стандартного способа получения количества элементов после построения. Фактически, для массива int он, вероятно, нигде не хранится. Счет необходим только для массивов элементов с нетривиальными деструкторами, так что delete[] может вызвать правильное количество деструкторов. В вашем примере нет никаких вызовов деструкторов, так как int не имеет деструктора.

1 голос
/ 05 июня 2011

Вероятно, имеется один или два подсчета количества элементов в таком распределении в зависимости от типа и реализации, которую вы используете, хотя вы не можете получить к ним доступ так, как вам, вероятно, нужно.

Первая - это учетная информация, хранящаяся в используемом вами фактическом менеджере памяти (библиотеке, предоставляющей malloc).Он будет хранить, что запись некоторого размера была выделена в свободном хранилище системы (например, с помощью glibc malloc возможно выделение кучи или анонимное выделение памяти).Это пространство будет, по крайней мере, таким же большим, как данные, которые вы пытаетесь сохранить (sizeof (int) * count + delta, где delta - информация об отслеживании компилятора C ++, о которой я говорю ниже), но она также может быть больше, даже значительно.

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

Как уже говорили другие, если вам нужно отслеживать информацию о размере выделения, вы, вероятно, хотите использовать вектор, вы даже можете использовать ее в качестве фактического массивав случае необходимости с указателем по математике (подробнее см. http://www.cplusplus.com/reference/stl/vector/).

1 голос
/ 05 июня 2011

C ++ обычно намеренно не позволяет вам получить доступ к этой информации, потому что массивы - это простые типы, которые не хранят эту информацию, связанную с ними.В конечном счете, эта информация должна храниться, но компилятор может выяснить, как, где и когда по стандартам C ++ можно оптимизировать сборку.

В принципе, либо храните ее где-нибудь, либо (лучше, большую часть времени), используйте std::vector.

1 голос
/ 05 июня 2011

Кто сказал, что на самом деле есть один?

Этот материал зависит от реализации и как таковой неинтересен для вас, меня или любого, кто хочет это знать.

0 голосов
/ 05 июня 2011

Нет, вам нужно следить за этим самостоятельно, если вам нужно знать.

Многим людям нравится использовать std :: vector, если это не фиксированный размер.std :: vector отслеживает размер, выделенный для вас.

...