2017-08-03 7 views
11

Ayrılmış bir ayırma kullanarak shared_ptr oluştururken, C++ 14 ctor'da açık bir silme işlevi sağlanmalı ve üye işlevi sıfırlanmalıdır. C++ 17, Dizi özelliği Shared_ptr destekleyerekC++ 17, dizinin shared_ptr öğesini desteklediğinden, bu, T [] için açık bir delicinin artık hem ctor'da gerekmediği anlamına gelir ve sıfırlanır?

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! 

bu artık hem ctor gerekli ve yeniden belirlenen?

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? 

cevap

2

Sen shared_ptr<T[]> şimdi doğal olarak delete[] düzgün çağıran kolları, doğrudur.

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

T bir dizi türü değil, işaretçi p sahibi bir Shared_ptr nesne oluşturur. Aksi takdirde, p ve 'un sahibi olan bir paylaşılan_ptr öğesi, [] p öğesini siler.

Ve bildiğim kadarıyla reset() olarak gider

:

shared_ptr eşdeğerdir

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

(p) .swap (* this). spesifikasyon-gereken özel deleter transfer edecek

.

+0

bu std :: default_delete önemli rol <>() da gitti anlamına mı geliyor? – sandthorn

+1

'std :: default_delete <>()', farklı bir konu olan 'unique_ptr <>' ile ilgilidir. – Frank

İlgili konular