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

  • newreleaseblitz

    newreleasebl

    13 Ocak 2010
  • pjtoohot

    pjtoohot

    15 NİSAN 2008
  • sghaff1

    sghaff1

    23 Mart 2009