2016-06-17 5 views
0

я использовал для выделения памяти в моей C++ проект с новымunique_ptr на символ * преобразование

char* buffer = new char [size]; 
... 
delete[] buffer; 

, и я бы очень хотел, чтобы двигаться вперед и использовать unique_ptr, как этот

unique_ptr<char[]>buffer(new char[size]); 

но потом Я использую istream& get (char* s, streamsize n);, который принимает char* в качестве первого аргумента, так что мне делать? Я пытался использовать типы, но не смог. Я также знаю, что вместо указателей я могу использовать vector<char>, но я не очень люблю его использовать. Спасибо!

+0

http://stackoverflow.com/questions/16711697/is-there-any-use-for-unique-ptr-with-array – AnatolyS

+1

Возможный дубликат [Использовать уникальный \ _ptr для владения и необработанного указателя в противном случае?] (http://stackoverflow.com/questions/12555441/use-unique-ptr-for-ownership-and-raw-pointer-otherwise) –

+5

Если вы сомневаетесь в том, как использовать класс, рекомендуется проконсультироваться с некоторой документацией о это, например [cppreference] (http://en.cppreference.com/w/cpp/memory/unique_ptr/get). – Angew

ответ

7

Класс std::unique_ptr имеет метод, называемый get(), для доступа к базовому указателю: используйте его.

unique_ptr<char[]> buffer(new char[size]); 
... 
myIstream.get(buffer.get(), n); 
1

Специализация: std::unique_ptr<T[]> специализация для массивов. Как использовать его в вашем случае в показанном Smeehey в его ответе.

Но, как Скотт Майер «Эффективное Modern C++» Пункт 18 (курсив мой):

Существование станд :: unique_ptr для массивов должны быть только интеллектуальный интерес к вам, потому что станд: : array, std :: vector и std :: string - практически всегда лучшие варианты структуры данных, чем массивы raw.

Таким образом, использовать классы, которые сделаны для этой цели вместо взлома своего пути там с std::unique_ptr.

0

Один из способов - использовать vector, а не unique_ptr, но с использованием unique_ptr имеет свои преимущества.
Я также столкнулся с той же проблемой ранее, в которой у меня был буфер, выделенный с помощью unique_ptr, и передал его как аргумент для чтения функции. Единственный способ избавиться от этого - использовать метод get(), который преобразует unique_ptr в char*. Также убедитесь, что у вас есть #include <memory>, чтобы избежать других ошибок, с которыми я столкнулся.

Спасибо!