SORU
12 Ocak 2012, PERŞEMBE


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
12 Ocak 2012, PERŞEMBE


Neler oluyor

T t; yazarken türde bir nesne yaratıyorsun Totomatik depolama süresi. Otomatik olarak kapsam dışına çıktığında temizlen.

new T() yazarken türde bir nesne yaratıyorsun Tdinamik depolama süresi. Otomatik olarak temizlenir değil.

new without cleanup

Bunu temizlemek için delete için bir işaretçi geçirmek gerekir:

newing with delete

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!

newing with deref

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

newing with automatic_pointer

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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CMTelly

    CMTelly

    2 Mayıs 2007
  • psidot

    psidot

    2 Kasım 2006
  • Visual Life

    Visual Life

    3 Temmuz 2006