2016-04-03 41 views
3

Ben bir işlev içinde bir tartışma için bellek ayrılamadı için aşağıda iki farklı çözümler gördüm:** kullanarak bir işlev bağımsız değişken için bellek ayırma veya * &

kullanma **:

template <class T> 
void funcPP(T ** ppnDynamicInt) { 
    *ppnDynamicInt = new T; 
} 
kullanılması

vs

* &

template <class T> 
void funcRP(T *& pnDynamicInt) { 
    pnDynamicInt = new T; 
} 

Örnek işlevleri kullanarak ->

daha güvenli/daha iyi bir çözümdür Ne
int * pnDynamicInt; 
funcPP(&pnDynamicInt); 
funcRP(pnDynamicInt);//memory leak I know ;) 

? Bir çözüm daha verimli mi?

(Not: Ben akıllı işaretçiler :) ile daha iyi olurdu biliyorum) dil garanti pnDynamicInt boş asla olduğunu, çünkü ben funcRP öneririm, sadece iki alternatif arasında gösterilen yapmayı düşündüğünüz

+9

Değeri döndürmek daha iyi olur. – interjay

+0

Bellek sızıntısı mı? Ben öyle düşünmüyorum. –

+1

@Jorn, bir bellek sızıntısıdır çünkü pnDynamicInt'in önceki değeri, yeni bir değer atanmadan önce silinmemiş/serbest bırakılmamıştır ve artık bu işaretçiye erişmenin bir yolu yoktur. – Isaac

cevap

6

(referanslar boş olamaz), ancakboş gösterici ise *ppnDynamicInt = new T; tanımsız davranışa neden olabilir. Bunun dışında aynıdır (funcRP neat sintax kullanır)

Not: İşlevlerin nasıl kullanıldığına bağlı olarak, delete pnDynamicInt gibi önceki değeri silmek isteyebilirsiniz.

Düzenleme: 'Garantiler' ile, null-referansları tanımlanmamış bir yolu yoktur, oysa boş göstericiler iyi tanımlanmıştır.

+0

FYI pratikte boş bir referans almak mümkündür: 'funcRP (* ((T **) NULL))'. Bu tanımlanmamış davranış olsa da, test edilmemelidir ve kim yaparsa bir segfaultu hak eder. – Adam

+0

@Adam Belki 'garantiler' kelimelerin zayıf bir seçimidir, ancak bu durumda, tanımlanmamış bir boş göstericiyi iptal edersiniz, bu yüzden teknik olarak herhangi bir şey olabilir, hatta işlevi çağırmayabilir. Bir işaretçi argümanı durumunda, 'funcPP (nullptr)' iyi tanımlanmış ve işlevini çağıracaktır (tabiri '* ppnDynamicInt = new T;' artık tanımsız olacaktır.) – Isaac

+0

@Adam: Kod örneği kesin olarak tanımlanmamış bir davranış olduğu için "boş referans" değildir. C++ 'da boş referans yok. –

1

İşlecin değişebileceği arama sitesinde daha açık olduğu için funcPP'yi tercih ederim.

İlgili konular