Как вы 'realloc' в C ++?

Как я могу realloc в C ++? Похоже, что отсутствует в языке - есть new и delete, но не resize!

Мне это нужно, потому что, поскольку моя программа читает больше данных, мне нужно перераспределить буфер для его хранения. Я не думаю, что delete старый указатель и new новый, больший, правильный выбор.

69 голосов | спросил bodacydo 14 PM00000020000004031 2010, 14:39:40

3 ответа


0

Используйте :: std :: vector!

Type* t = (Type*)malloc(sizeof(Type)*n) 
memset(t, 0, sizeof(Type)*m)

становится

::std::vector<Type> t(n, 0);

Тогда

t = (Type*)realloc(t, sizeof(Type) * n2);

становится

t.resize(n2);

Если вы хотите передать указатель в функцию вместо

Foo(t)

использование

Foo(&t[0])

Это абсолютно правильный код C ++, потому что vector - это умный C-массив.

ответил f0b0s 14 PM00000030000005631 2010, 15:11:56
0

Изменение размера в C ++ неудобно из-за потенциальной необходимости вызывать конструкторы и деструкторы.

Я не думаю, что есть фундаментальная причина, по которой в C ++ нельзя было использовать оператор resize[] для new[] и delete[], которые сделали что-то похожее на это:

newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;

Очевидно, oldsize будет получено из секретного местоположения, так же, как и в delete[] и Type будут получены из типа операнда. resize[] произойдет сбой, если тип не может быть скопирован - это правильно, поскольку такие объекты просто нельзя переместить. Наконец, приведенный выше код строит объекты по умолчанию перед их назначением, что вы не хотели бы использовать в качестве фактического поведения.

Существует возможная оптимизация, где newsize <= oldsize, чтобы вызывать деструкторы для объектов «после конца» вновь созданного массива и делать ничего больше. Стандарт должен был бы определить, требуется ли эта оптимизация (например, когда вы resize() вектор), разрешено, но не определено, разрешено, но зависит от реализации или запрещено.

Тогда вы должны задать себе вопрос: «На самом ли деле это полезно предоставить, учитывая, что vector также делает это, и разработан специально для предоставления контейнера с изменяемым размером (непрерывной памяти - это требование пропущено в C ++ 98, но исправлено в C ++ 03), который лучше подходит, чем массивы с методами работы C ++? "

Я думаю, что ответом считается "нет". Если вы хотите делать изменяемые размеры буферов C-способом, используйте malloc / free / realloc, которые доступны в C ++. Если вы хотите сделать изменяемые размеры буферов способом C ++, используйте вектор (или deque, если вам на самом деле не требуется непрерывное хранение). Не пытайтесь смешивать их, используя new[] для необработанных буферов, если только вы не реализуете векторный контейнер.

ответил Steve Jessop 14 PM00000040000005831 2010, 16:36:58
0

попробуйте что-нибудь подобное:

typedef struct Board
{
    string name;
    int size = 0;
};

typedef struct tagRDATA
{
    vector <Board> myBoards(255);

    // Board DataBoard[255];
    int SelectedBoard;

} RUNDATA;

Вектор будет жаловаться. Вот почему массивы, malloc и new все еще существуют.

ответил some guest 17 Jpm1000000pmSun, 17 Jan 2016 23:30:11 +030016 2016, 23:30:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132