Thread overview
C++'da try-finally yapısı olsa unique ptr / shared ptr gibi yapılara yine de gerek olur muydu?
Aug 19, 2018
İbrahim
Aug 20, 2018
Salih Dinçer
Aug 20, 2018
kerdemdemir
August 19, 2018

Selamün Aleyküm;

C++'da bilindiği üzere try-catch blokları var lakin try-finally blokları yoktur. Eğer ki C++'da try-finally blokları olsaydı unique_ptr ve shared_ptr gibi şablonlara hala daha ihtiyacımız olur muydu?

Mesela unique_ptr ile alanı belleğe geri iade edemediğimiz durumlarda unique_ptr vs. kullanabiliyoruz:

void foo()
{
 int* n = new int; // heap alanından bellek ayırdık ve bu nesne ile işimiz bitince silmemiz lazım.
 ...
 // Eğer delete n şeklinde belleğe geri vermezsek belleğimizi gereksiz yere şişiriyor olabilir.
 // Ama delete n diyemeden return vs. ile fonksiyondan çıkarsak belleği geri iade edemiyoruz.
}

int main()
{
 foo();
}

// Bunun yerine unique_ptr şablonunu kullanalım:
void foo()
{
 std::unique_ptr<int> n(new int);
 ...
 // Şimdi bu fonksiyondan çıkınca n nesnesi silinecek.
}

Diğer yandan Object Pascal dilinde try-finally ile bu işi çözebiliyoruz:

procedure Foo;
var
 N : ^Integer;
begin
 New(N); // Bellek ayırdık.
 ...
 try
   ...
 finally // Herhangi bir durumda fonksiyondan çıkılsa bile finally bloğu çalışacak.
   Dispose(N); // Alanı belleğe geri iade ettik.
 end;
end;

Yani C++'da da try-finally olsa akıllı işaretçilere de gerek kalmaz mı acaba? Siz olsanız hangi yöntemi tercih edersiniz? Ya da başka bir yöntem mi tercih edersiniz?

Teşekkürler!

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 20, 2018

Aleyküm selam,

Dile hakim değilim, öte taraftan D-Lang çerçevesinde şu şekilde kullandığımızı köşeye not alayım:

void main()
{
   try
   {
      /* Hata döndürme olasılığı bulunan
         alt yordamları işlet */
   }

   catch (ErrnoException err)
   {
      /* Hataları denetle ve gerekiyorsa programın
         kontrolsüz sonlanmaması için önlem al */
   }
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 20, 2018

Aleyküm Selam İbrahim,

Evet bir çok kullanım sebebini ortadan kaldırabilirdi ama şunlar kalırdı bence hala

  • Exception kullanılmayan noexcept fonksiyonlar. Benim çalıştığım bir çok projede exception kullanılmıyordu.

  • Destructor gibi yerlerde yok edilmesi gereken işaretciler. Yani her zaman istenmeyen bir durum olduğunda değil bazen destructor'da belleği salıvermek istiyoruz. Ve vector.erase gibi fonksiyonlar sonrasında bir hata durumundan dolayı değil herçekten artık o obje ilgimiz kalmadığından salıvermek istiyoruz.

  • Başka durumlarda olabilir ama aklıma gelmedi.

Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 22, 2018

Ek olarak, her seferinde finally yazmayı hatırlamak yerine unique_ptr gibi türlerle bu işi otomatik hale getirmek yine de çok kullanışlı olurdu.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]