Каким образом можно узнать выделенный обьем памяти
через оперцию new/
например
char* a = new char[100]
как узнать что указатель
a
показывает на участок в 100 байт
?????????????????
Платформа Windows
Здравствуйте, __Andrey__, Вы писали:
A>Каким образом можно узнать выделенный обьем памяти A>через оперцию new/ A>например A>char* a = new char[100] A>как узнать что указатель A>a A>показывает на участок в 100 байт A>????????????????? A>Платформа Windows
_msize
Returns the size of a memory block allocated in the heap.
size_t _msize( void *memblock );
Routine Required Header Compatibility
_msize <malloc.h> Win 95, Win NT
Return Value
_msize returns the size (in bytes) as an unsigned integer.
Или даже давайте смотреть глубже :
указатель на денамически выделенный массив указателей.
Как узнать не просто размер , а количество елементов массива ?
Т.е. delete [] знает сколько нужно удалять
и а я хочу знать чего там лежит.
Здравствуйте, Kaa, Вы писали:
A>>Каким образом можно узнать выделенный обьем памяти A>>через оперцию new/
Kaa>Никак. Сохраняй размер при создании динамического блока. По указателю узнать что-бы то ни было нельзя.
я уже зарекся вот так сходу отвечать "Никак", "Нельзя", даже если точно знаю что никак и нельзя
Здравствуйте, __Andrey__, Вы писали:
A>msize работает, если память выделена через malloc A>или я не прав ?
Прав. Odi$$ey упускает, что оператор new может быть перекрыт глобально для, например, алтернативного выделения памяти, для отказа от CRT. Например, звать функцию операционной системы, либо использовать указатель из пула объектов, если реализован custom-распределитель памяти.
Здравствуйте, __Andrey__, Вы писали:
A>Или даже давайте смотреть глубже : A>указатель на денамически выделенный массив указателей. A>Как узнать не просто размер , а количество елементов массива ?
ну так раздели то что дает msize на sizeof одного указателя
A>Т.е. delete [] знает сколько нужно удалять A>и а я хочу знать чего там лежит.
никакое delete[] не удалит память выделенную по каждому указателю в массиве указателей, все равно сам должен будешь обойти и каждому персонально сделать delete
O$> я уже зарекся вот так сходу отвечать "Никак", "Нельзя", даже если точно знаю что никак и нельзя
Возможно, речь идет о конкретной реализации по умолчанию в конкретной CRT.
Собрав свою программу с libctiny, ты получишь альтернативную реализацию operator new/delete (да и malloc/freeбез использования CRT), и, соответственно, говорить, что в любой проге, использующей new, в итоге вызывается malloс, не верно в корне. Спроси у Влада. У них проекты без использования CRT вообще, а new они наверняка широко пользуют.
Здравствуйте, Kaa, Вы писали:
Kaa>Возможно, речь идет о конкретной реализации по умолчанию в конкретной CRT. Kaa>Собрав свою программу с libctiny, ты получишь альтернативную реализацию operator new/delete (да и malloc/freeбез использования CRT), и, соответственно, говорить, что в любой проге, использующей new, в итоге вызывается malloс, не верно в корне. Спроси у Влада. У них проекты без использования CRT вообще, а new они наверняка широко пользуют.
Kaa>Короче, дело еще и в окружении.
O$>ну так раздели то что дает msize на sizeof одного указателя
Эти грабли уже практически попали в QA. "Тольк бледнолицый..." malloc в релизе выделяет память блоками с выравниванием на 16 байт (ну, или типа того). Таким образом, написав:
void* p = malloc( 2 );
unsigned sz = _msize( p );
мы получим немного не то, что хотели бы (при обычном окружении в VC60)
Здравствуйте, Kaa, Вы писали:
Kaa>Здравствуйте, Odi$$ey, Вы писали:
O$>>ну так раздели то что дает msize на sizeof одного указателя Kaa>Эти грабли уже практически попали в QA. "Тольк бледнолицый..." malloc в релизе выделяет память блоками с выравниванием на 16 байт (ну, или типа того). Таким образом, написав: Kaa>
Kaa>void* p = malloc( 2 );
Kaa>unsigned sz = _msize( p );
Kaa>
Kaa>мы получим немного не то, что хотели бы (при обычном окружении в VC60)
попробовал, менял в настройках проекта выравнивание от 1 до 16 байт, результат всегда sz==2;
Kaa>мы получим немного не то, что хотели бы (при обычном окружении в VC60)
Дело не втом что он выделяет минимум 16 байт
а в том что мы сможем использовать все равно столько сколько запросили
и _msize вернет именно 2
По крайней мере у меня так работает при нормальном окружении.
Здравствуйте, __Andrey__, Вы писали:
Kaa>>мы получим немного не то, что хотели бы (при обычном окружении в VC60)
A>По крайней мере у меня так работает при нормальном окружении.
#include <stdio.h>
#include <malloc.h>
int main()
{
void * p = malloc( 2 );
unsigned sz = _msize( p );
printf( "Size == %u\n", sz );
return 0;
}
Скомпили в релизе (во всех трех вариантах релиза). Не поленись.