2017-01-12 6 views
3

Я googled и ничего не нашел. Наверное, я просто не знаю, как набрать правильный вопрос.Как использовать unique_ptr с std :: copy?

Хорошо, мой простой класс памятиBlock имеет два элемента данных, int size и int* data. Поэтому для создания конструктора копии я использую std :: copy для копирования копии. Теперь я хотел бы попробовать умный указатель C++ для замены необработанного указателя. Скажем, используя unique_ptr<int> data. Какова эквивалентность следующего кода? Потому что теперь rhs.data + size не будет работать.

std::copy(rhs.data, rhs.data + size, data); 
+3

'std :: copy (rhs.data.get(), rhs.data.get() + size, data.get());' –

+2

Почему бы не использовать 'std :: vector'? – NathanOliver

+3

Не будет 'std :: unique_ptr ' лучше? – wally

ответ

3

Прежде всего вам нужно выделить массив для созданного объекта, а затем вы можете скопировать ему значения. Например

MemoryBlock(const MemoryBlock &m) : size(m.size), data(new int[m.size]) 
{ 
    std::copy(m.data.get(), m.data.get() + m.size, data.get()); 
} 

Примите во внимание, что данные data члены должны быть объявлены как

std::unique_ptr<int[]> data; 

Если вы хотите добавить конструктор двигаться к классу можно определить его следующим образом

MemoryBlock(MemoryBlock &&m) : size(0), data(nullptr) 
{ 
    std::swap(m.size, size); 
    std::swap(m.data, data); 
} 
3

Вы можете использовать std::unique_ptr<>::get() function, который возвращает указатель на управляемый объект или nullptr если объект не принадлежит.

т.е .:

std::copy(rhs.data.get(), rhs.data.get() + size, data.get()); 

Как также прокомментировал NathanOliver, еще один вариант заключается в замене сырого указателя памяти, принадлежащий unique_ptr с std::vector в целом.

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

  • Нет связанных вопросов^_^