2016-03-20 18 views
0

Bir işlevdeki örneklenmiş bir nesneyi nasıl silersiniz ve başka bir işlev çağrıldığında silebilirsiniz? ÖrneğinAnlık nesnelerin bir işlev dışında silinmesi mi?

:

int function_test(){ 
    object* a = new object(); 
} 

int function_test2(){ 
    delete a; 
} 

Nesne bir function_test2() çağrıldığında silinmesi gerekiyor. Function_test() nesne a değerini oluşturur ve ayarlar.

+1

Bir referans olmadan nesneyi silemezsiniz. Referansı geri verdin. Her bir 'function_test()' çağırma işlemini temizlemek için 'function_test2()' nin çağrılması gerektiğini belgelemek için çok dikkatli olursunuz. – SJuan76

cevap

0

Bir şeyleri silmek için, bir şeye işaretçi gerekir. Eğer işlevi function_test bir nesneyi ayırmak ve function_test2 kullanarak silmek istediğinizde

Eğer silmek istediğiniz nesneye ibrenin ulaşmaya function_test2 için bir yol bakmak gerekir.

Orada bunu yaparken çok çeşitli yolları vardır, ancak function_test arayana işaretçi döndürür ve sonra function_test2 bu işaretçi geçirmeden için en yaygın biridir:

object* function_test() { 
    object* a = new object(); 
    ... 
    return a; 
} 

void function_test2(object* a) { 
    ... 
    delete a; 
} 

arayan transferi" gerekir "böyle işaretçi,: işaretçi transfer

object obj = function_test(); 
... 
function_test2(obj); 

diğer yolları, dosya-statik işaretçileri kullanarak küresel işaretçileri kullanarak ve örnek değişkenleri kullanırken fonksiyonları function_test ve function_test2, bir sınıfın üye işlevleridir.

+0

İşlev a bir nesne oluşturur ve ayarlar a. Başka bir işlev çağrıldığında silinmek için ihtiyacım var. – Akito

+0

@Akito Kodunuzda 'a'' function_test' için yereldir. 'Function_test' bittikten sonra buna ulaşmanın bir yolu yoktur - kodunuzda bir bellek sızıntısı olur. – dasblinkenlight

+0

Çözmeyi denediğim şey bu. Nesne a'yı başlatmalı ve function_test2 çağrıldığında onu silmeli, daha sonra function_test işlevini çağırır ve sonra nesneyi yeniden oluşturur. Bir bellek sızıntısı yarattığını biliyorum.Bu yüzden buna bir çözüm bulmaya çalışıyorum. – Akito

0

Yerel değişkenleri işlevler arasında aktaramazsınız. Böyle bir şey yapmak isterseniz, işaretçiyi döndürmenizi öneririm, böylece bir sonraki işleve iletebilirsiniz.

object *function_test() 
{ 
auto *o = new object{}; 
return o; 
} 

ancak bu size diyoruz ve bellek yönetimi yapmak zorunda nerede her yerde bu değişkeni yakalamak zorunda dezavantajına sahiptir. Büyük olasılıkla sadece için bir şey nesne yönelimli benzer kullanmak istiyorsanız:

olarak kullanılabilir
class ObjectOwner final 
{ 
public: 
    int function_test(){ 
     a = new object(); 
    } 

    int function_test2(){ 
     delete a; 
    } 
private: 
    object *a{nullptr}; 
}; 

:

ObjectOwner owner; 
owner.function_test(); 
owner.function_test2(); 

Eğer 2nd çağırmak unuttuğunuzda böylece std::unique_ptr<object> kullanarak olurdu da iyisi işlev, hafıza serbest bırakıldı.

Son olarak, bir kurucu/yıkıcı kullanmayı düşünebilirsiniz. yazmayı izin

class ObjectOwner final 
{ 
public: 
    ObjectOwner() 
     : a(std::make_unique<object>()) 
    { 
    } 

    ~ObjectOwner() = default; 
    void func() { /*Do something with a*/ } 
private: 
    std::unique_ptr<object> a{}; 
}; 

:

ObjectOwner owner{}; 
owner.func(); 
İlgili konular