2012-12-10 20 views
20
buffer = new char[64]; 
buffer = std::make_shared<char>(char[64]); ??? 

make_shared<>() kullanarak bir diziye bellek ayırabilir misiniz?Make_shared'e eşdeğer bir şeye sahip bir dizi ayırabilir misiniz?

yapabileceğim: buffer = std::make_shared<char>(new char[64]);

Ama bu hala yeni çağıran içerir, bu make_shared daha güvenli ve daha verimli benim anlayışına var.

+3

'std :: vector tamponu (64); –

cevap

19

make_shared noktası paylaşılan ibrenin kontrol bloğuna yönetilen nesne dahil etmek, belki de hedeflerinize tatmin edecek bir C++ 11 dizisi kullanarak, C++, 11 ile uğraşıyoruz yana

? std::shared_ptr (std::unique_ptr aksine örneğin) operator[] sağlamaz çünkü sen, [] yeni alacağındançok bir işaretçi olarak paylaşılan bir gösterici aynı şekilde kullanamaz

#include <memory> 
#include <array> 
int main() 
{ 
    auto buffer = std::make_shared<std::array<char, 64>>(); 
} 

Not. Bunu yapmak zorunda kalırsınız: (*buffer)[n] = 'a';

+0

Neden, evet. Yeni C++ 11 hileleri öğrenmeyi asla bırakmam ... –

+0

Dizinin boyutunu derleme zamanında belirleyemem? –

+2

@JoshElias Elbette zamanınızı derleyebilirsiniz. Çalışma zamanı mı demek istiyorsun? 'Make_shared ', çalışma zamanı argümanlarını 'T' yapıcısına ilettiğinden, bu, yapıcı argümanı olarak dizi boyutunu alan kendi sınıfınızı gerektirir. Ya da sadece paylaşılan bir vektör yapın. – Cubbi

1

Bu nasıl olur?

template<typename T> 
inline std::shared_ptr<T> MakeArray(int size) 
{ 
    return std::shared_ptr<T>(new T[size], [](T *p){ delete [] p; }); 
} 

auto buffer = new char[64]; 
auto buffer = MakeArray<char>(64); 
+0

Yeni 'shared_ptr' oluşturma ile make_shared' kullanımı arasında bir fark var, daha sonra 1 tane daha az atomik işlem yapıyor ve mümkün olduğunda tercih ediliyor. – SagiLow

2

Paylaşılacak belleğe mi ihtiyacınız var? Bunun yerine std::unique_ptr kullanmak ve üzerinde std::make_unique mevcut olabilir C++ 14:

auto buffer = std::make_unique<char[]>(64); 

C++ 20 mevcut bir std::make_shared versiyonu olacak:

auto buffer = std::make_shared<char[]>(64); 
İlgili konular