2013-04-19 3 views
0

Не удалось найти точный ответ на вопрос:C++: Перераспределение памяти без cstdlib

освобождает память и выделение снова единственный способ перераспределения памяти без использования cstdlib? Если это не так, то каковы возможные решения?

Заранее благодарен.

+0

Что вы имеете в виду по перераспределить? Можете ли вы дать свой вариант использования? –

+1

Если вы имеете в виду функцию stdlib 'realloc', то да, нет альтернативы C++. –

+1

Вы имеете в виду без использования realloc()? BTW, realloc frees и память mallocs позади сцены в любом случае по своему усмотрению. –

ответ

1

Если вы реализуете свой собственный векторный класс, то вам нужно правильно скопировать содержимое вектора, а не использовать realloc, так как вы не знаете, что делает сам объект при его копировании (или в C++ 11 для соответствующих случаев, перемещен). Представьте себе, например, что у вас есть объект, который делает что-то вроде этого:

class B; 

class A 
{ 
    private: 
    B* bp; 
    public: 
    A(B *p) : bp(p) 
    { 
    } 
}; 


class B 
{ 
    public: 
    A a; 
    B() : A(this) 
    { 
     ... 
    } 
}; 

MyVector<B> v; 

При копировании объекта на другой адрес, без вызова конструктора, то bp указателя в A будет указывать на какое-то «случайное» место. Это было бы довольно неприятной ошибкой, чтобы попытаться найти.

[И да, есть куча вещей не хватает в указанных выше классов - это не означает, как полное объявление класса, и т.д., и т.д.]

+0

hmmm, очень полный, спасибо –

1

Возможно, вы имеете в виду, как это делается с помощью std :: vector (или другого контейнера) при загрузке его с памятью, удалите все элементы, затем позвоните, чтобы освободить память, а затем выделите в нее новые элементы, таким образом выделяя больше памяти? В этом случае, по мере увеличения объема памяти в контейнере, контейнер может перераспределить свою память по мере необходимости.

Поскольку вы упоминаете вы создаете Vector:

В проектах, где мы должны были это сделать, потому что мы не имеем вектор реализации (встроенный), он является общим для выделения набора куска памяти больше, чем требуется для предотвращения постоянных перераспределений памяти, которые несут большие затраты на копирование и вызывают фрагментацию памяти. Общая схема заключалась в том, чтобы выделить «разумный» размер для приложения, а затем удвоить этот размер, если предел достигнут. Если пользователь когда-либо запрашивал, чтобы буфер был уменьшен по размеру или был установлен на размер при инициализации, мы игнорируем эту эвристику и используем запрошенный размер.

+0

. Я пытаюсь реализовать вектор сам по себе :) вот почему у меня есть этот вопрос –

+0

Ах - надеюсь, как учебное упражнение? Не заново изобретать колесо и все такое :) –

+0

да, конечно –

Смежные вопросы