Ne oluyor
Yazdığınızda , otomatik depolama süresiT t;
olan türde bir nesne oluşturuyorsunuz . Kapsam dışına çıktığında otomatik olarak temizlenecektir.T
Eğer yazarken new T()
sen türünde bir nesne oluştururken T
ile dinamik depolama süresi . Otomatik olarak temizlenmeyecek.
delete
Temizlemek için ona bir işaretçi iletmeniz gerekir :
Ancak, ikinci örneğiniz daha kötü: işaretçinin referansını kaldırıyorsunuz ve nesnenin bir kopyasını oluşturuyorsunuz. Bu şekilde ile oluşturulan nesnenin işaretçisini kaybedersiniz new
, böylece isteseniz bile onu asla silemezsiniz!
Ne yapmalısın
Otomatik saklama süresini tercih etmelisiniz. Yeni bir nesneye ihtiyacınız var, sadece şunu yazın:
A a; // a new object of type A
B b; // a new object of type B
Dinamik depolama süresine ihtiyacınız varsa, işaretçiyi, tahsis edilen nesneye, onu otomatik olarak silen bir otomatik depolama süresi nesnesinde saklayın.
template <typename T>
class automatic_pointer {
public:
automatic_pointer(T* pointer) : pointer(pointer) {}
// destructor: gets called upon cleanup
// in this case, we want to use delete
~automatic_pointer() { delete pointer; }
// emulate pointers!
// with this we can write *p
T& operator*() const { return *pointer; }
// and with this we can write p->f()
T* operator->() const { return pointer; }
private:
T* pointer;
// for this example, I'll just forbid copies
// a smarter class could deal with this some other way
automatic_pointer(automatic_pointer const&);
automatic_pointer& operator=(automatic_pointer const&);
};
automatic_pointer<A> a(new A()); // acts like a pointer, but deletes automatically
automatic_pointer<B> b(new B()); // acts like a pointer, but deletes automatically
Bu, çok açıklayıcı olmayan RAII ( Resource Acquisition Is Initialization ) adıyla anılan yaygın bir deyimdir . Temizlenmesi gereken bir kaynak aldığınızda, onu otomatik depolama süresi olan bir nesneye yapıştırırsınız, böylece temizleme konusunda endişelenmenize gerek kalmaz. Bu, bellek, açık dosyalar, ağ bağlantıları veya istediğiniz her şey gibi herhangi bir kaynak için geçerlidir.
Bu automatic_pointer
şey zaten çeşitli şekillerde var, ben sadece bir örnek vermek için verdim. Adlı standart kitaplıkta çok benzer bir sınıf bulunmaktadır std::unique_ptr
.
Ayrıca adında eski bir tane (C ++ 11 öncesi) var, auto_ptr
ancak garip bir kopyalama davranışına sahip olduğu için artık kullanımdan kaldırıldı.
Ve sonra std::shared_ptr
, aynı nesneye birden çok işaretçiye izin veren ve yalnızca son işaretçi yok edildiğinde onu temizleyen daha akıllıca örnekler var .