Размер памяти, выделенной на куче - PullRequest
2 голосов
/ 14 февраля 2011

Можете ли вы проверить размер памяти, выделенной в куче, если буфер содержит символы '0'?

char *c = new char[6]; //random size memory
memset(c, 0, 6);

Ответы [ 3 ]

3 голосов
/ 14 февраля 2011

Нет надежного способа сделать это - вы должны хранить эту информацию самостоятельно.

operator new[]() Функция может быть реализована (и заменена вами) любым способом, так что вы просто не сможете узнать размересли вы не знаете точную реализацию в деталях.

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

2 голосов
/ 14 февраля 2011

Нет, в общем 1 Вы не можете.Вы должны хранить эту информацию отдельно.

Если вам нужно использовать эту память в виде строки или массива, я советую использовать std::string или std::vector, которые сами выполняют всю эту бухгалтерию.

1. то есть "в отношении стандарта"

Я вижу, что ваш вопрос относится к MSVC ++;в этом случае предоставляются некоторые помощники для отладки кучи , но они работают только при компиляции проекта в режиме отладки;Я думаю, что есть какая-то другая специфичная для компилятора функция для получения выделенного размера, но она не будет работать, если используются пользовательские распределители.

С другой стороны, API, такие как LocalAllocВы знаете, насколько велик выделенный кусок памяти (см., например, LocalSize).

Но опять же, я думаю, что это более чистый дизайн, чтобы отслеживать эту информацию самостоятельно.

1 голос
/ 14 февраля 2011

Нет.Вы должны хранить объем выделенной памяти как отдельную переменную, и вам нужно брать ее с собой всякий раз, когда вы хотите что-то сделать с выделенной структурой.Это громоздко, но может быть быстро.В качестве безопасной и удобной замены используйте std :: vector, boost :: array и т. Д.

...