2016-02-17 3 views
1

Я пытаюсь реализовать класс массива, который может иметь динамический размер и будет выделять память без инициализации значений. Мой вопрос в отношении того, как я освободить память более поздней версии:Выделение и освобождение памяти C++

Могу ли я реализовать свой код в этом случае ?:

template<typename Type> 
class Array { 
    Type *values; 

    Array(int size) : values(new (size * sizeof(Type)) char()) {} 
    ~Array() { 
     delete[] values; 
    } 
} 

Или мне нужно что-то вроде этого ?:

template<typename Type> 
class Array { 
    Type *values; 
    void *memory; 

    Array(int size) : memory(new (size * sizeof(Type)) char()), values(memory), size(size) {} 
    ~Array() { 
     delete[] memory; 
    } 
} 

ПРИМЕЧАНИЕ !!!! Я знаю, что это будет выделять память без инициализации каких-либо объектов типа. Это предполагаемое поведение моего кода. Кроме того, приведенный выше код не является моей полной реализацией, это только код, который будет выделять и освобождать память, потому что это то, что меня интересует с этим вопросом.


После дальнейших исследований я обнаружил, что я должен использовать malloc() и free() делать то, что я пытаюсь сделать. Спасибо всем ответам и комментариям.

+0

Почему не 'память (новый тип [размер])'? – Holt

+0

FWIW, почему бы и нет 'vector ' или хотя бы изучить, как это работает и что он делает! Во втором примере вы никогда не строите бит 'Type', но вы уничтожаете' size' из них, что, безусловно, неверно. Кроме того, ваш синтаксис выделения выглядит странно, я бы ожидал 'новый char [некоторый размер здесь]'. –

+0

Причина, по которой я не использую память (новый тип [размер]) или вектор , состоит в том, что оба экземпляра будут выделять память, а затем построить экземпляр для каждой позиции. В моем вопросе я указал, что я не хочу создавать экземпляры типа, а выделяю для него только память. – Dynisious

ответ

2

Вы можете использовать Type*, чтобы облегчить вам жизнь, и используйте operator new для получения памяти без создания объектов.

Type* values; //No aliasing/casting issues 
Array(int size) : values((Type*)::operator new(sizeof(Type) * size)) //... 
~Array() { /*clean up extant objects*/ ::operator delete(values); } 

Тогда вы можете использовать новые и явные вызовы деструктора размещения для управления элементами. Кроме того, размещение нового не выделяет память. Он создает объект по указанному адресу.

1

Размещение new фактически не выделяет никакой памяти. Это просто синтаксис вызова конструктора с уже выделенной памятью.

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

Вы, вероятно, следует использовать std::allocator<T>::allocate и std::allocator<T>::deallocate, но вы можете использовать malloc/free, new char[]/delete[] (char*)arr или ::operator new/::operator delete.

+0

Не включен в мой ответ: class-scope 'operator new' и' operator delete', так как я их не понимаю. – o11c

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