Создание объектов в C ++ без использования «new» - PullRequest
0 голосов
/ 17 сентября 2010

Я хочу сделать программу, которая, скажем, представляет матрицу теперь матрица будет представлена ​​вектором, что каждый объект в векторе будет представлять пример ячейки: вектор теперь при построении матрицы конструктор получает список ячеек для вставки в матрицу. Размер списка неизвестен во время компиляции

Я заинтересован в создании этой матрицы без использования памяти в куче. Другими словами, не создание объекта с использованием слова «новый» или «удалить» Есть ли способ сделать это, если я не знаю, сколько объектов должны быть вставлены в вектор?

Ответы [ 5 ]

2 голосов
/ 17 сентября 2010

Существует специальный способ использования new для выделения памяти в стеке или в качестве статического хранилища с использованием так называемого оператора размещения нового .В этой новой версии вы резервируете часть памяти и явно указываете новой, где вы хотите хранить определенную переменную.Это будет работать следующим образом:

   #include <new>
   int main()
   {
      char buffer[500];  // chunk of memory
      int p*;
      p = new (buffer) int[10];
   }

Обратите внимание, что вам нужно включить заголовок new , чтобы использовать этот специальный новый оператор.В этом случае, поскольку вы используете автоматическое хранение, память будет освобождена после выхода из блока, в котором она была объявлена ​​(основной).

Ссылки: C ++ Primer plus.Глава 9. Страница 420

1 голос
/ 17 сентября 2010

Ну, если вы не хотите использовать память в куче, где еще вы хотите получить ее?

a) зависит от системы - вы можете попросить операционную систему выделить немного памяти для вас. Но это плохой стиль (зависит от системы), и он будет использовать одну и ту же оперативную память ... просто по-другому. Например, :: GlobalAlloc или :: LocalAlloc в Windows 32 будут делать такие вещи, если вы действительно заинтересованы в этом.

b) файлы с отображением в памяти - это может быть интересно, если вы спрашиваете, потому что считаете, что у вас недостаточно ОЗУ и время доступа не является проблемой.

в) прибегнуть к функциям C, таким как malloc / free, и привести указатели ... которые получают память из кучи, просто избегая ключевых слов "new" и "delete".

Однако трудно сказать, что такое «хорошее» решение без информации , почему вы хотите избежать new / delete. Вам нужно динамическое выделение памяти, эти два инструмента помогут вам сделать это.

Не могли бы вы объяснить / перефразировать ваш вопрос, чтобы вы могли получить более точные ответы?

1 голос
/ 17 сентября 2010

Используйте alloca для получения указателя, а затем используйте оператор new на месте:

void *p = alloca(sizeof(Class));
new (p) Whatever(arguments);

Однако, сделайте прочитайте alloca страницу руководства перед использованием! Будьте очень осторожны . Как говорит Джим Бриссом, alloca не переносим.

Вам не нужно delete. Память будет освобождена, когда функция вернет

1 голос
/ 17 сентября 2010

Есть способ, он очень ограничен и очень неортодоксален.Вам нужно будет создать массив статического размера unsigned char, который образует пул памяти.Там будет ограничение на размер списка объектов.Вам нужно будет перегрузить оператор new (и оператор delete) для этого класса, чтобы специально предназначаться для такого пула памяти.

Тем не менее, на самом деле нет веской причины идти по этому пути.

1 голос
/ 17 сентября 2010

Не существует стандартного способа сделать это без выполнения прямого (и, следовательно, зависящего от платформы) манипулирования стековым фреймом программы / функции с использованием инструкций по сборке - что я бы от души не одобрил.Что мешает вам использовать кучу?

...