c++ Узнать размер выделенного блока памяти
А вообще, если тебе это очень надо -- напиши свой враппер, но по стандарту тебе никто никогда не скажет сколько ты выделил памяти.
Я бы попробовал генерировать и отлавливать исключение при выходе за пределы массива, и шагать по нему
Не факт, что аллокатор запоминает размер выделенного блока.Я то же самое сначала подумал, но delete[] ведь будет убивать объекты из массива? А как он это сделает на зная количество и смещение каждого следующего (т.е. размер)?
size * sizeof(Type) ?
С другой стороны, была же в C функция realloc, которая должна была откуда-то брать старый размер
Что ж, отрицательный результат (невозможность сделать это в соотв. со стандартом) - тоже результат.
Спасибо.
Я бы попробовал генерировать и отлавливать исключение при выходе за пределы массива, и шагать по нему
Ты что, псих?
пока MSDN-ом не подтвержденное
MSDN стал Библией? Это же ахтунг, говорить о плюсах и ссылаться на MSDN.
Есть у меня ощущение, пока MSDN-ом не подтвержденное, что delete[] просто уничтожает указатель, не трогая самих данных.Ещё бы оно подтвердилось!
в моём случае можно просто переменную рядом держать с размером, или vector<> использовать.
Конечно же второе! Зачем изобретать велик?
Хотя может быть в твоей случае лучше map/hash_map?
Есть у меня ощущение, пока MSDN-ом не подтвержденное, что delete[] просто уничтожает указатель, не трогая самих данных.
По стандарту delete [] вызывает деструктор для каждого элемента (если десктруктор не выкинет исключения, иначе -- unspecified behavior).
С другой стороны, была же в C функция realloc, которая должна была откуда-то брать старый размер
Где хранится размер -- зависит от реализации malloc'а. В ГНУтом malloc'е размер хранится в выделенном блоке до пользовательской части. (Точнее там размер не хранится, хранятся два указателя на смежные блоки, размер вычисляется арифметически из адреса блока и указателя на следующий; плюс к тому, в младшем бите указателей хранятся дополнительные флаги -- указатели выровнены). То есть при выделении памяти реально выделяется блок, больше запрашиваемого, в его начало кладутся два указателя | флаги, а пользователю возвращается указатель = (char *) указатель на блок + 2*sizeof (char *).
Встречаются malloc'и которые хранят размер или что ещё в других местах и не хранят вовсе (точнее хранят, например, в константе или дефайне и выделяют блоки всегда одного размера).
(если десктруктор не выкинет исключения, иначе -- unspecified behavior).АФАИК, все-таки функция terminated вызывается, или какая-то такая
если десктруктор не выкинет исключения
Руки бы отрывал пидорасам, которые могут подумать о том, чтобы в деструкторе исключение кинуть.
А ведь могут и не подумать. Напишут что-то типа m_...ReleaseResources; а оттуда исключение полетит.
Напишут что-то типа m_...ReleaseResources;
Ну это надо понимать что-то из области Микрософта?
Ну это надо понимать что-то из области Микрософта?Почему? просто решил память освободить, или файл закрыть, а тут раз -- исключение.
Освобождение памяти никогда еще не кидало исключений, только выделение. (А не как в микрософте, 0 возвращает)
вообще, в декларации надо писать virtual и throw всегда.
Деструктор не должен делать ничего, что может привести к исключению.Должен или не должен - это одно. А что может - другое.
PS Майкрософт тут не при чём, а на open source код уже насмотрелись: ни одного нормально сделанного проекта, одни крики и пальцы.
нету throw в мсвц в объявлениях функций
Освобождение памяти никогда еще не кидало исключений, только выделение.А что случится, если попытаешься освободить что-нть не то? Программа вылетит? Это типа лучше?
нету throw в мсвц в объявлениях функций
Т. е. нельзя написать "virtual ~classname throw;"?
~CAtlArray throw;
_msize_dbg(*p, _NORMAL_BLOCK)
возвращает размер в байтах
допустим ты это напишешь, и что дальше?
чем это тебе поможет от следующего кода?
virtual ~ResourceHolder throw
{
void * buffer = 0;
delete buffer;
}
virtual ~ResourceHolder throw
{
void * buffer = 0;
delete buffer;
}
а тут вообще undefined beheiver. На некоторых системах этот код вообще может на ура проработать.
Короче, к исключениям это не относится.
#include <malloc.h>
_msize(*p);
Returns the size of a memory block allocated in the heap.
Возвращает размер в байтах.
В манах ничего такого нет, значит это не POSIX-стандартно!
А вдруг завтра это станет стандартом, значит, сегодня ты потерял возможность соответствовать стандарту в будущем
Оставить комментарий
Dmitriy82
Есть ли способ определить размер блока памяти, выделенногоnew Type[size]?
Единственное, что имеется - указатель на этот блок. По логике
это должно быть возможно, т.к. это делает delete, но предусмотрено ли?