Neden 'yeni' neden bellek sızıntısı?
C öğrendim# ilk ve şimdi C ile başladım . Anladığım kadarıyla, operatör C new
C benzer değildir#.
Bu örnek kodu bir bellek sızıntısı nedenini açıklayabilir misiniz?
class A { ... };
struct B { ... };
A *object1 = new A();
B object2 = *(new B());
CEVAP
Neler oluyor
T t;
yazarken türde bir nesne yaratıyorsun T
otomatik depolama süresi. Otomatik olarak kapsam dışına çıktığında temizlen.
new T()
yazarken türde bir nesne yaratıyorsun T
dinamik depolama süresi. Otomatik olarak temizlenir değil.
Bunu temizlemek için delete
için bir işaretçi geçirmek gerekir:
Ancak, ikinci örnek daha kötüdür: işaretçi kaldırma ve nesnenin bir kopyasını yapıyoruz. Bu şekilde nesne asla eğer isteseydin bile silmek new
ile oluşturulan işaretçiyi kaybedersin!
Ne yapman gerektiğini
Otomatik depolama süresi tercih edilmelidir. Yeni bir nesne, sadece yazmak gerekir:
A a; // a new object of type A
B b; // a new object of type B
Eğer dinamik depolama süresi varsa, otomatik olarak siler otomatik depolama süresi bir nesne tahsis nesnesi için işaretçi depolar.
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 değil-çok açıklayıcı adıyla DEMİRYOLU giden yaygın bir deyim vardır (Kaynak Toplama Başlatma). Sen temizleme ihtiyacı kaynak almak, temizlik konusunda endişelenmenize gerek yok bu yüzden Otomatik depolama süresi bir nesne koy. Bu bellek, açık dosyalar, ağ bağlantıları, ya da fantezi ne olursa olsun, herhangi bir kaynak için geçerlidir.
automatic_pointer
Bu şey zaten sadece bir örnek vermek sağladık çeşitli formları var. Çok benzer bir sınıf standart kütüphane std::unique_ptr
adı var.
Bir de eski (pre-C 11) auto_ptr
adında biri vardı ama şimdi garip kopyalama bir davranış olduğundan kaldırılmış.
Ve sonra daha da akıllı bazı örnekler, aynı nesne için birden fazla işaretçiler sağlar ve sadece son bir işaretçi yok olduğunda temizler std::shared_ptr
gibi.
Neden bir WordPress kullanmak çok kötü...
Neden olabilir .NET bellek sızıntısı v...
Ne zaman ve neden bir işletim sistemi ...
Bir bellek sızıntısı bulma neden Ruby...
Neden C programcıları 'yeni kulla...