Способ увеличения памяти, выделяемой в свободном магазине - PullRequest
0 голосов
/ 08 августа 2009

Можно ли постепенно увеличивать объем выделенной памяти в свободном хранилище, на которое указывает указатель? Например, я знаю, что это возможно.

char* p = new char; // allocates one char to free store
char* p = new char[10]; // allocates 10 chars to free store

но что, если я хочу сделать что-то вроде увеличения объема памяти, на который указывает указатель. Что-то вроде ...

char input;
char*p = 0;
while(cin >> input)  // store input chars into an array in the free store
    char* p = new char(input);

очевидно, что это просто укажет p на новый выделенный вход, но, надеюсь, вы понимаете, что цель состоит в том, чтобы добавить новое распределение символов для адреса, на который указывает p, и сохранить там последний ввод. Это возможно? Или я просто застрял с назначением номера набора.

Ответы [ 4 ]

4 голосов
/ 08 августа 2009

Решение C состоит в том, чтобы использовать malloc вместо new - это делает realloc доступным. Решение C ++ состоит в том, чтобы использовать std :: vector и другие полезные контейнеры, которые заботятся об этих низкоуровневых проблемах и позволяют работать на гораздо более высоком, гораздо более хорошем уровне абстракции! -)

2 голосов
/ 08 августа 2009

Вы можете сделать это, используя функцию realloc (), хотя она может работать только для памяти, выделенной с помощью malloc (), а не "new"

сказав это, вы, вероятно, не хотите выделять больше памяти на байт за раз. Ради эффективности вы должны размещать в блоках, существенно превышающих один байт, и отслеживать, сколько вы на самом деле использовали.

1 голос
/ 08 августа 2009

Вы, кажется, используете C ++. Хотя вы можете использовать realloc, C ++ позволяет избежать явного управления памятью, которое безопаснее, проще и, вероятно, более эффективно, чем делать это самостоятельно.

В вашем примере вы хотите использовать std :: vector в качестве класса контейнера для символов. std :: vector будет автоматически расти по мере необходимости.

Фактически, в вашем случае вы можете использовать std :: istreambuf_iterator и std:push_back до std::copy входные данные в std::vector.

1 голос
/ 08 августа 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...