2016-12-14 1 views
4

In C++ 17 std::shared_ptr hat eine operator [] Indizierung vektorbasierte Zeiger (http://en.cppreference.com/w/cpp/memory/shared_ptr/operator_at)std :: shared_ptr operator [] gleichwertigen Zugang

ermöglichen Wie kann ich ähnliche zugreifenden erhalten, wenn eine solche Betreiber nicht verfügbar ist und ich noch will einen intelligenten Zeiger für eine Reihe von Elementen verwenden, wie zum Beispiel:

std::shared_ptr<unsigned char> data; 
data.reset(new unsigned char[10]>; 
// use data[3]; 
+3

AFAIK pre C++ 17 Sie können kein Array in einem 'shared_ptr' eingeben. Im Moment haben Sie den falschen Deleter, der zu UB führt. – NathanOliver

+1

@NathanOliver sicher OP kann, mit einem richtigen Deleter? (welches OP nicht zur Verfügung stellte). – user2079303

+0

@ user2079303 Guter Punkt. Ich habe vergessen, einen benutzerdefinierten Deleter zu übergeben. – NathanOliver

Antwort

8

so:

data.get()[3] 

Howev Denken Sie daran, was Nathan in Kommentaren gesagt hat. Der Standardlöscher von std::shared_ptr<unsigned char> ist falsch für einen Zeiger, der von new[] zugewiesen wird. Sie werden std::shared_ptr::reset(Y* ptr, Deleter d); mit einem geeigneten deleter verwenden müssen:

data.reset(new unsigned char[10], [](auto p){ delete[] p; }); 

Oder, wenn Sie nicht die Hässlichkeit des Lambda gefällt, können Sie eine wiederverwendbare Helfer definieren:

struct array_deleter { 
    template<typename T> void operator()(const T* p) { 
     delete[] p; 
    } 
}; 

// ... 

data.reset(new unsigned char[10], array_deleter()); 
+0

Danke! Das heißt, ich sollte 'data.reset (new unsigned char [10], delete [])' verwenden? – rkioji

+1

@rkioji das ist nicht syntaktisch korrekt. Siehe die Bearbeitung für ein Beispiel. – user2079303

Verwandte Themen