Если вы хотите непрерывный блок памяти, вы должны выделить его целиком с помощью одного вызова operator new[]
или malloc()
или подобного. Многократные вызовы этих функций не гарантируют какого-либо смежности выделенных блоков. Вы можете выделить большой блок, а затем вырезать из него части по мере необходимости.
И вам следует delete
и free()
все блоки, ранее выделенные с помощью new
и malloc()
, иначе вы потеряете память и, вероятно, сделаете вашу программу нестабильной (в какой-то момент она не сможет выделить больше памяти) и оказывать ненужное давление на память в ОС, возможно, замедляя работу других программ или делая их нестабильными.
Размещение нового, однако, фактически не выделяет никакой памяти. Он просто создает объект в указанном месте, поэтому вам не нужно освобождать эту память дважды.
Одна проблема, которую я вижу в вашем коде, заключается в том, что он не выравнивает целые числа. На некоторых платформах чтение или запись целых чисел, превышающих 1 байт, из / в память должны быть выровнены, и если это не так, вы можете либо читать / записывать значения из / в неправильные места, либо получать исключения CPU, приводящие к завершению вашей программы. В этом отношении x86 очень требователен и не будет возражать, хотя может обременять вас ухудшением производительности.