Başlık hemen hemen her şeyi söylüyor. Temelde, yasal bu yapmaktır: gördüğüm diğer yazılarda dayanarakC++: <Base> vektörü Türetilmiş nesneler içerebilir mi?
class Base {
//stuff
}
class Derived: public Base {
//more stuff
}
vector<Base> foo;
Derived bar;
foo.push_back(bar);
aşağıdaki tamamdır, ama buna parçacığı güvenli hale getirmek için zor çünkü bu durumda işaretçileri kullanmak istemiyoruz .
vector<Base*> foo;
Derived* bar = new Derived;
foo.push_back(bar);
Neden parçacığı olduğunu
Base
uygulama denir göreceksiniz herhangi bir şekilde güvenlik burada uygun? İstisna güvenliği demek istedin mi? Eğer öyleyse, evet, 'push_back' bir sallanma işaretçisini bırakarak bir istisna atabilir. Bunu işlemek için akıllı işaretçiler kullanabilirsiniz. – DanielKO@DanielKO Bir üretici ve tüketici iş parçacığı arasında bir arabellek olarak bir STL kapsayıcısı kullanıyorum. Kapsayıcıyı işaretçilerle doldurmak istemiyorum, çünkü kapsayıcının bir muteks ile korunmasına rağmen, herhangi bir iş parçacığı başka bir veriye işaret ettiğinde, bu veriler korunmuyor. – Beezum
Bu, bir iplik güvenliği problemi değildir. İşaretçiler olmasa bile, bir parçayı güvenli olmayan bir şekilde parçalara ayırabilir. Yapmanız gereken tek şey, uygun semantikleri tanımlamaktır, böylece içerikler (işaretçiler veya doğrudan olarak depolanır) uygun tutarlılık tutarlılık mekanizmaları olmadan değiştirilmez. Özellikle, eğer sınıfın bir kullanıcısı “izin” olmaksızın öğeye bir işaretçi kaydedebiliyorsa, aynı şekilde bir işaretçi ya da referans almayacağını düşündüren şey nedir? – DanielKO