Aracılığıyla paylaş


Özel Durumlar: Özel Durumlarda Nesneleri Serbest Bırakma

Bu makalede, bir özel durum oluştuğunda nesneleri boşaltma gereksinimi ve yöntemi açıklanmaktadır. Konu başlıkları şunlardır:

Çerçeve veya uygulamanız tarafından oluşan özel durumlar normal program akışını kesintiye uğratıyor. Bu nedenle, özel durum oluştuğunda nesneleri düzgün bir şekilde atabilmeniz için nesneleri yakından izlemek çok önemlidir.

Bunu yapmak için iki birincil yöntem vardır.

  • ve catch anahtar sözcüklerini kullanarak try özel durumları yerel olarak işleyin, ardından tek bir deyimle tüm nesneleri yok edin.

  • Daha fazla işleme için özel durumu bloğun catch dışına oluşturmadan önce bloktaki herhangi bir nesneyi yok edin.

Bu iki yaklaşım aşağıdaki sorunlu örneğe çözüm olarak aşağıda gösterilmiştir:

void SomeFunc()        // Problematic code
{
   CPerson* myPerson = new CPerson;

   // Do something that might throw an exception.
   myPerson->SomeFunc();

   // Now destroy the object before exiting.
   // If SomeFunc above throws an exception this code will
   // not be reached and myPerson will not be deleted.
   delete myPerson;
}

Yukarıda yazıldığı gibi, myPerson tarafından SomeFuncbir özel durum oluşturulursa silinmez. Yürütme, normal işlev çıkışını ve nesneyi silecek kodu atlayarak doğrudan bir sonraki dış özel durum işleyicisine atlar. Özel durum işlevden ayrıldığında nesne işaretçisi kapsamın dışına çıkar ve program çalıştığı sürece nesnenin kapladığı bellek hiçbir zaman kurtarılamaz. Bu bir bellek sızıntısı; bellek tanılaması kullanılarak algılanabilir.

Özel Durumu Yerel Olarak İşleme

Try/catch paradigması, bellek sızıntılarını önlemeye ve özel durumlar oluştuğunda nesnelerinizin yok edilmesini sağlamaya yönelik bir savunma programlama yöntemi sağlar. Örneğin, bu makalenin önceki bölümlerinde gösterilen örnek aşağıdaki gibi yeniden yazılabilir:

void SomeFunc()
{
   CPerson* myPerson = new CPerson;

   try
   {
      // Do something that might throw an exception.
      myPerson->SomeFunc();
   }
   catch (CException* e)
   {
      // Handle the exception locally
      e->Delete();
   }

   // Now destroy the object before exiting.
   delete myPerson;
}

Bu yeni örnek, özel durumu yakalamak ve yerel olarak işlemek için bir özel durum işleyicisi ayarlar. Ardından işlevden normal bir şekilde çıkar ve nesneyi yok eder. Bu örneğin önemli yönü, özel durumu yakalamak için try/catch bloklarıyla bir bağlam oluşturulmasıdır. Yerel özel durum çerçevesi olmadan işlev hiçbir zaman bir özel durumun oluştuğundan haberdar olmaz ve normal bir şekilde çıkıp nesneyi yok etme şansına sahip olmaz.

Nesneleri Yok Ettikten Sonra Özel Durumlar Oluşturma

Özel durumları işlemenin bir diğer yolu da bunları bir sonraki dış özel durum işleme bağlamlarına geçirmektir. Bloğunuzda catch , yerel olarak ayrılmış nesnelerinizi temizleyebilir ve daha fazla işlem için özel durumu oluşturabilirsiniz.

Oluşturma işlevinin yığın nesnelerini serbest bırakması gerekebilir veya gerekmeyebilir. İşlev her zaman normal durumda döndürmeden önce yığın nesnesini serbest bıraksa, işlevin özel durum oluşturmadan önce yığın nesnesini serbest bırakması gerekir. Öte yandan, işlev normalde normal durumda döndürmeden önce nesneyi serbest bırakmazsa, yığın nesnesinin serbest bırakılıp bırakılmayacağı konusunda büyük/küçük harf temelinde karar vermeniz gerekir.

Aşağıdaki örnekte, yerel olarak ayrılmış nesnelerin nasıl temizlenebileceği gösterilmektedir:

void SomeFunc()
{
   CPerson* myPerson = new CPerson;

   try
   {
      // Do something that might throw an exception.
      myPerson->SomeFunc();
   }
   catch (CException* e)
   {
      e->ReportError();
      // Destroy the object before passing exception on.
      delete myPerson;
      // Throw the exception to the next handler.
      throw;
   }

   // On normal exits, destroy the object.
   delete myPerson;
}

Özel durum mekanizması çerçeve nesnelerini otomatik olarak serbest bırakıyor; çerçeve nesnesinin yıkıcısı da çağrılır.

Özel durumlar oluşturabilen işlevleri çağırırsanız, özel durumları yakaladığından ve oluşturduğunuz nesneleri yok etme şansına sahip olduğunuzdan emin olmak için try/catch bloklarını kullanabilirsiniz. Özellikle, birçok MFC işlevinin özel durumlar oluşturabileceğini unutmayın.

Daha fazla bilgi için bkz . Özel Durumlar: Özel Durumları Yakalama ve Silme.

Ayrıca bkz.

Özel Durum İşleme