Merhaba arkadaşlar. C++ dilinde bir metod içerisinde tanımlanana pointer değişkenler methodun işi bitince bellekten otomatik olarak kaldırılıyor mu? Yoksa biz delete ile değişkeni dispose etmelimiyiz. Örnek olarak bir kod parçası tanımlamak gerekirse :

#include <iostream>

using namespace std;

class TestClass{

    public:
        TestClass();
        virtual ~TestClass();

};

TestClass::TestClass(){
    cout << "TestClass Constructed" << endl;
}

TestClass::~TestClass(){
    cout << "TestClass Destructed" << endl;
}

void methodCallWithReferance();
void methodCallWithPointerDelete();
void methodCallWithPointerWithoutDelete();

int main(){
    cout << "--Application Started--" << endl;
    methodCallWithReferance();
    cout << "***********************" << endl;
    methodCallWithPointerDelete();
    cout << "***********************" << endl;
    methodCallWithPointerWithoutDelete();
    return 0;
}

void methodCallWithReferance(){
    TestClass testClass;
    cout << "methodCallWithReferance" << endl;
}

void methodCallWithPointerDelete(){
    TestClass *testClass = new TestClass();
    cout << "methodCallWithPointerDelete" << endl;
    delete testClass;
}

void methodCallWithPointerWithoutDelete(){
    TestClass *testClass = new TestClass();
    cout << "methodCallWithPointerWithoutDelete" << endl;
}

Bu kodun çıktısı ise aynen şöyle;

--Application Started--
TestClass Constructed
methodCallWithReferance
TestClass Destructed
***********************
TestClass Constructed
methodCallWithPointerDelete
TestClass Destructed
***********************
TestClass Constructed
methodCallWithPointerWithoutDelete

Burdan görünen o ki method içerisinde tanımlanan pointer değişkenler delete ile dispose edilmez ise bellekte kalmaya devam ederler? Sizcede doğru mu?

soruldu: 06 Kas '12, 15:35

querman's gravatar image

querman
391162028
cevap kabul oranı: 0%

değiştirildi: 06 Kas '12, 15:35


C++'da delete ve delete[] operatörlerini nesnenin ömrü bittiğinde ( sahibi olan sınıf değişkeni {} blok sonuna geldiğinde ) otomatik çalıştırtmak için smart pointer (akıllı işaretçiler) kullanılır.

Örneğin: C++98/03 için:

void methodCallWithSmartPointersAKATheRightWayToDoIt()
{
  std::auto_ptr<TestClass> testInstance(new TestClass);
  std::cout<< "methodCallWithSmartPointersAKATheRightWayToDoIt"<< std::endl;
}

C++11 için: (#include <memory>)

void methodCallWithSmartPointersAKATheRightWayToDoIt()
{
  std::unique_ptr<TestClass> testInstance(new TestClass);
  std::cout<< "methodCallWithSmartPointersAKATheRightWayToDoIt"<< std::endl;
}

std::shared_ptr, std::weak_ptr gibi daha başka işlere yarayan akıllı işaretçiler de mevcut ve araştırmaya değer.

permanent link

cevaplandı: 05 Şub '13, 12:24

nurettin's gravatar image

nurettin
2.2k2441
cevap kabul oranı: 14%

değiştirildi: 05 Şub '13, 12:27

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×45
×4

Soruldu: 06 Kas '12, 15:35

Görüntüleme: 745 kez

Son güncelleme: 05 Şub '13, 12:28

powered by BitNami OSQA