Почему невозможно получить длину буфера, выделенного таким образом.
AType * pArr = new AType[nVariable];
Когда тот же массив освобожден
delete [] pArr;
среда выполнения должна знать, сколько нужно освободить. Есть ли средства для доступа к длине перед удалением массива. Если нет, почему нет такого API, который будет извлекать длину?
Есть ли какие-либо средства для доступа к длине перед удалением массива?
Нет, это невозможно определить.
Стандарт не требует от реализации запоминания и предоставления информации о количестве элементов, запрашиваемых через new
,
Реализация может просто вставлять конкретные битовые комбинации в конце выделенных блоков памяти вместо запоминания количества элементов и может просто искать шаблон при освобождении памяти.
Короче говоря, это исключительно деталь имплементации.
Кстати, есть 2 варианта, чтобы практически преодолеть эту проблему:
std::vector
который предоставляет вам функции-члены, такие как size()
или же new
по крайней мере выделяет достаточно памяти столько, сколько вы просили.
Вы уже знаете, сколько памяти вы запросили, чтобы вы могли легко рассчитать длину. Вы можете найти размер каждого элемента, используя sizeof
,
Total memory requested / Memory required for 1 item = No of Items
Время выполнения знает, сколько было выделено. Однако такие детали зависят от компилятора, поэтому у вас нет кроссплатформенного способа справиться с этим.
Если вам нужна та же функциональность и возможность отслеживать размер, вы можете использовать std :: vector следующим образом:
std::vector< AType > pArr( nVariable );
Это имеет дополнительное преимущество использования RAII.
delete
оператору не нужно знать размер для освобождения выделенной памяти, так же как free
системный вызов не. Это потому, что эта проблема остается за операционной системой, а не системой времени выполнения компиляторов.
Среда выполнения должна освободить ту же сумму, что и выделенная, и это
отслеживать это каким-то образом (обычно очень косвенно). Но
нет надежного способа получить из суммы, выделенной на количество
элементы: выделенная сумма не может быть меньше, чем количество
элементы умножают размер каждого элемента, но часто они будут больше.
Например, соображения выравнивания означают, что new char[5]
а также new
будет часто выделять одинаковое количество памяти, и есть
char[8]
различные стратегии распределения, которые могут вызвать значительно больше памяти
выделяться тем, что строго необходимо.
Нет, не совсем. По крайней мере, не в зависимости от платформы, определенным образом.
В большинстве реализаций размер динамически размещаемого массива сохраняется до фактического массива.
В C ++ нет переносимого способа получить размер динамически размещаемого массива из необработанного указателя.
Под MSVC и WIN32 вы можете получить размер выделенного блока с помощью функции _msize (void *).
увидеть https://msdn.microsoft.com/en-us/library/z2s077bc.aspx для дальнейших деталей.
почему бы не немного дополнительной информации, как это:
template <typename T> class AType
{
public:
AType(size_t s) : data(0)
{
a_size = s;
data = new T[s];
}
~AType() {
if (data != nullptr)
delete [] data;
}
size_t getSize() const
{
return a_size * sizeof(T);
}
private:
size_t a_size;
T* data;
};