您需要使用的unique_ptr版動態分配數組:
std::unique_ptr<std::list<int>[]> map1(new std::list<int>[10]);
^^ ~~~~~ !
在這裏看到:http://en.cppreference.com/w/cpp/memory/unique_ptr:
template <
class T,
class Deleter
> class unique_ptr<T[], Deleter>;
您還可以使用std::make_unique(如在評論建議),您將獲得編譯錯誤而不是UB,因爲它的接口可以防止它:
std::unique_ptr<std::list<int>[]> up1 = std::make_unique<std::list<int>[]>(10);
auto up2 = std::make_unique<std::list<int>[]>(10);
但是,此代碼已成功運行。
unique_ptr map2(new int [10]);
它仍然未定義在上面的代碼中的行爲,它可能工作或可能會導致段錯誤。如上所述的unique_ptr接受任何指針,但在破壞期間將始終調用delete
。在指向動態分配數組的指針上調用delete
是UB。這就是爲什麼你需要撥打delete[]
這是什麼unique_ptr
動態分配陣列。
兩件的類型構造函數使用
new[]
代碼具有未定義的行爲並被破壞。 –參考[this](http://stackoverflow.com/questions/16711697/is-there-any-use-for-unique-ptr-with-array) – Incomputable
一個'list'和一個'list [10 ]'是兩種不同的類型 –
NathanOliver