Может быть, вы путаете operator new() и выражение с new?
Да нет, не путаю
Так вот, если вы попытаетесь сделать что-то типа realloc() с объектами, то даже если память останется той же, компилятор создаст в этой памяти новые объекты ...
Идея в следующем:
Во-первых, переопределяется способ выделения памяти не для всех объектов в программе, а только для объектов определенного класса (того самого, для которого надо хранить огромные массивы).
Наша функция "типа realloc" сначала просто увеличивает размер блока памяти "по месту". Компилятор и знать про это ничего не знает, поэтому никаких конструкторов автоматически вызывать не будет.
Затем явно вызываем new для инициализации новых объектов, память под которые была только что добавлена. При этом переписываем new для объектов нашего класса таким образом, чтобы он не выделял новую память, а просто возвращал указатель на соответствующий кусочек внутри нашего блока. Например, можно просто передавать индекс элемента, который надо инициализировать, в вызове new в качестве дополнительного параметра, типа
Код:
new(10) A();
При этом компилятор вызовет конструктор для инициализации этого блока памяти, и все будет нормально.
Конечно, тут есть еще масса моментов, которые надо учесть, типа
- корректная работа со стандартным заголовком объекта (отрицательные смещения, по которым хранится адрес VTBL и, наверное, еще что-то.
- чтобы правильно работал delete [], в "типа realloc" надо корректировать значение поля, содержащего фактический размер массива
- каким-то образом надо резервировать виртуальное адресное пространство, чтобы его хватило на увеличение длины массива
- и т.п.
И еще: все вышеизложенное - просто идея, как это можно сделать. Ни малейшего намерения эту идею реализовывать в жизни у меня нет. Но в принципе, все должно работать