Подтвердить что ты не робот

Как вы realloc на С++?

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

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

4b9b3361

Ответ 1

Использовать:: 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-массив.

Ответ 2

Правильный вариант - это, вероятно, использование контейнера, который выполняет вашу работу, например std::vector.

new и delete не могут изменять размер, поскольку они выделяют достаточно памяти для хранения объекта данного типа. Размер данного типа никогда не изменится. Есть new[] и delete[], но вряд ли когда-либо есть причина их использования.

То, что realloc делает в C, скорее всего, будет просто malloc, memcpy и free, хотя менеджерам памяти разрешено делать что-то умное, если доступно достаточно непрерывной свободной памяти.

Ответ 3

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

Я не думаю, что есть основополагающая причина, по которой на С++ у вас не могло быть оператора 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 и специально разработан для предоставления контейнера с изменяемым размером (смежной памяти - это требование опущено) в С++ 98, но исправлено в С++ 03), что лучше подходит, чем массивы с С++ способами делать вещи?

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

Ответ 4

попробуйте что-то вроде этого:

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

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

    // Board DataBoard[255];
    int SelectedBoard;

} RUNDATA;

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