2017-08-03 1 views
11

shared_ptrを分割割り当てで作成する場合は、明示的な削除機能をC++ 14 ctorおよびresetメンバ関数で提供する必要があります。C++ 17はarrayのshared_ptrをサポートしているので、これはctorとresetの両方でT []の明示的なdeleterが不要になったことを意味しますか?

using std::string; 
using std::shared_ptr; 
using std::default_delete; 
int arr_size{}; 
... 


auto string_arr_sptr_cpp14 = 
     shared_ptr<string[]>(new string[arr_size], default_delete<string[]>()); 
string_arr_sptr_cpp14.reset(new string[arr_size], default_delete<string[]>()); 
// define an explicit deleter, 
// or otherwise, "delete ptr;" will internally be used incorrectly! 

C++ 17で配列機能のshared_ptrをサポートすることで、ctorとリセットの両方でこれらの機能は不要になりますか?

auto string_arr_sptr_cpp17 = shared_ptr<string[]>(new string[arr_size]); 
string_arr_sptr_cpp14.reset(new string[arr_size]); 
// deduced delete function calls "delete[] ptr;" correctly now? 

答えて

2

あなたはshared_ptr<T[]>が今自然に正しくdelete[]を呼び出して処理し、正しいです。

http://eel.is/c++draft/util.smartptr.shared#const-5影響

:Tが配列型でない場合、ポインタpを所有のshared_ptrオブジェクトを構築します。それ以外の場合は、pを所有するshared_ptrを作成し、delete [] pを呼び出す指定されていない型のdeleterを作成します。

そして限り行くreset()として:shared_ptrの(P).swap(* this)を相当

http://eel.is/c++draft/util.smartptr.shared#mod-3

を。

仕様に準拠したカスタムディレクタを転送するもの。

+0

これは、std :: default_delete <>()の主要な役割もなくなったことを意味しますか? – sandthorn

+1

'std :: default_delete <>()'は 'unique_ptr <>'に関連しています。これは別の問題です。 – Frank

関連する問題