C ++: как перераспределить массив, используя то же пространство памяти, но уменьшаясь в размере - PullRequest
0 голосов
/ 22 марта 2020

Если у меня есть динамически распределенный массив char* arr = new char[100];.

1: Если я хочу, оставьте первую половину массива и освободите последние 50, как мне это сделать. Таким образом, я, по сути, получаю тот же указатель, но получаю, как если бы я сделал char* arr = new char[50].

2: Если я хочу, оставьте вторую половину массива и освободите первые 50, как мне это сделать. Таким образом, я, по сути, получаю оригинальный указатель плюс 50, но я получаю, как будто я сделал char* arr = new char[50].

Могу ли я сделать delete[99] arr; и положить его в al oop. Я могу сделать это путем перераспределения массива, но я хочу, чтобы он работал как можно быстрее.

Пожалуйста, не приставайте ко мне по поводу орфографии и грамматики, я знаю, что мне нужно справиться с этим лучше.

1 Ответ

2 голосов
/ 22 марта 2020

Вы не можете изменить размер выделения, сделанного с помощью new.

Если выделение осуществляется с помощью std::malloc (или друзей), вы в принципе можете использовать std::realloc, чтобы сообщить системный распределитель, который вам больше не нужен во второй половине, но это невозможно для первой половины, и я бы посчитал сомнительным, будет ли какая-то польза от этого вообще.

Дополнительно std::malloc делает не создавать объекты до C ++ 20 и, следовательно, сделать его довольно сложным для использования без неопределенного поведения. (В частности, массив не может быть вставлен в него реально.)

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

Точно так же вы будете держать около двух указателей до конца, один до конца выделения и от одного до конца используемой части (или двух целых чисел, обозначающих размеры обоих).

...