Нет, это невозможно, поскольку все в том виде, в каком оно разработано из коробки. Однако у вас есть несколько вариантов сделать это самостоятельно.
Если вам это нужно исключительно для стандартных контейнеров, вы можете реализовать распределитель, который отслеживает память, которая была выделена (а не освобождена) через этот распределитель.
Если вам нужна эта возможность для всего, что выделено через new
(независимо от того, контейнер или нет), вы можете предоставить свою собственную реализацию operator new
на глобальной и / или зависящей от класса основе и заставить ее (например) построить неупорядоченную карту от указателей на размеры блока, чтобы сообщить вам размер любого выделенного блока (и с этим вам нужно будет предоставить функцию для получения этого размера). В зависимости от платформы это также может быть реализовано с использованием специфичных для платформы функций. Например, когда вы создаете компилятор Microsoft (ну, на самом деле, библиотеку), ваша реализация operator new
вообще не должна делать ничего особенного, а функция для получения размера блока будет выглядеть примерно так:
size_t block_size(void const *block) {
return _msize(block);
}
Еще одна возможность - увеличить размер выделения каждого запрошенного блока на размер целого числа, достаточно большого, чтобы удерживать этот размер. В этом случае вы должны выделить больший фрагмент данных, чем запрашивал пользователь, и сохранить размер этого блока в начале возвращаемого блока. Когда пользователь запрашивает размер блока, вы берете правильное (отрицательное) смещение от указателя, который он передает, и возвращаете значение, которое вы там сохранили.
person
Jerry Coffin
schedule
07.07.2016