• 11-05-2020, 18:45:17
    #1
    Merhaba;

    Bir fonksiyon1 adlı fonksiyon içinde for ile nesne oluşturuyorum şöyle ki :
    for(i=0;i<10;i++){
            
     Kitap i;
                    
                    i.setAd(setAd);
                    
                    
                }
    Bu şekilde sürekli i değeriyle nesne oluşturuyorum ve içindekilere ulaşıyorum fakat başka bir fonksiyon2 adlı başka bir fonksiyonda bu oluşturduğum nesneye tekrardan ulaşamıyorum çünkü 1.fonksiyonda kalmıştı bunu global nasıl yaparım?
    Teşekkürler.
  • 11-05-2020, 20:06:57
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Modal adlı üyeden alıntı: mesajı görüntüle
    Merhaba;

    Bir fonksiyon1 adlı fonksiyon içinde for ile nesne oluşturuyorum şöyle ki :
    for(i=0;i<10;i++){
    
    Kitap i;
    
    i.setAd(setAd);
    
    
    }
    Bu şekilde sürekli i değeriyle nesne oluşturuyorum ve içindekilere ulaşıyorum fakat başka bir fonksiyon2 adlı başka bir fonksiyonda bu oluşturduğum nesneye tekrardan ulaşamıyorum çünkü 1.fonksiyonda kalmıştı bunu global nasıl yaparım?
    Teşekkürler.


    Kitap * pKitap[10];

    for(int i = 0; i < 10; i++)
    {
    pKitap[i] = new Kitap;
    pKitap[i]->setAd(setAd);
    }

    pKitap[0]->setAd(setAd); // sonradan erişmek için
    pKitap[1]->setAd(setAd);
    pKitap[2]->setAd(setAd);
    pKitap[3]->setAd(setAd);

    bu şekilde 10 a kadar gider



    Eğer 1 defa oluşturup sürekli kullanacaksanız serbest bırakmaya gerek yok, fakat sürekli new operatörü kullanılacaksa bellek sızıntısı oluşur, aşağıdaki şekilde serbest bırakmak gerek

    for(int i = 0; i < 10; i++)
    {
    free(pKitap[i]); // new oparatörü ile açılan alanı serbest bırak.
    }
  • 11-05-2020, 22:37:27
    #3
    sawashan adlı üyeden alıntı: mesajı görüntüle
    Kitap * pKitap[10];

    for(int i = 0; i < 10; i++)
    {
    pKitap[i] = new Kitap;
    pKitap[i]->setAd(setAd);
    }

    pKitap[0]->setAd(setAd); // sonradan erişmek için
    pKitap[1]->setAd(setAd);
    pKitap[2]->setAd(setAd);
    pKitap[3]->setAd(setAd);

    bu şekilde 10 a kadar gider



    Eğer 1 defa oluşturup sürekli kullanacaksanız serbest bırakmaya gerek yok, fakat sürekli new operatörü kullanılacaksa bellek sızıntısı oluşur, aşağıdaki şekilde serbest bırakmak gerek

    for(int i = 0; i < 10; i++)
    {
    free(pKitap[i]); // new oparatörü ile açılan alanı serbest bırak.
    }

    free(pKitap[i]); yerine delete pKitap[i] kullanmak daha doğru olacaktır.
  • 11-05-2020, 22:53:47
    #4
    sawashan adlı üyeden alıntı: mesajı görüntüle
    Kitap * pKitap[10];

    for(int i = 0; i < 10; i++)
    {
    pKitap[i] = new Kitap;
    pKitap[i]->setAd(setAd);
    }

    pKitap[0]->setAd(setAd); // sonradan erişmek için
    pKitap[1]->setAd(setAd);
    pKitap[2]->setAd(setAd);
    pKitap[3]->setAd(setAd);

    bu şekilde 10 a kadar gider



    Eğer 1 defa oluşturup sürekli kullanacaksanız serbest bırakmaya gerek yok, fakat sürekli new operatörü kullanılacaksa bellek sızıntısı oluşur, aşağıdaki şekilde serbest bırakmak gerek

    for(int i = 0; i < 10; i++)
    {
    free(pKitap[i]); // new oparatörü ile açılan alanı serbest bırak.
    }

    Çok çok teşekkür ederim
  • 11-05-2020, 23:12:37
    #5
    emregll adlı üyeden alıntı: mesajı görüntüle
    free(pKitap[i]); yerine delete pKitap[i] kullanmak daha doğru olacaktır.



    Delete operatörü direk free() fonksiyonunu çağırıyor normal de, fakat farklı derleyiciler için daha uyumlu olması açısından delete kullanımı daha iyi olabilir
  • 12-05-2020, 00:20:52
    #6
    sawashan adlı üyeden alıntı: mesajı görüntüle


    Delete operatörü direk free() fonksiyonunu çağırıyor normal de, fakat farklı derleyiciler için daha uyumlu olması açısından delete kullanımı daha iyi olabilir
    delete()
    {
    free()
    }

    gibi yanlış bir şey anlaşılabilir yazdıklarınızdan hocam.

    delete: deallocation yapar ve destructor ı çağırır.
    free: deallocation yapar, destructor ı çağırmaz.

    #include <iostream>
    class Test {
    public:
    ~Test(){
    std::cout << "Destructor called!" << std::endl;
    }
    };
    int main()
    {
    Test* testPtr = new Test();
    free(testPtr);
    return 0;
    }
    ekrana herhangi bir şey basmazken,

    #include <iostream>
    class Test {
    public:
    ~Test(){
    std::cout << "Destructor called!" << std::endl;
    }
    };
    int main()
    {
    Test* testPtr = new Test();
    delete testPtr;
    return 0;
    }
    "Destructor called!" çıktısı üretecektir.

    "Delete operatörü direk free() fonksiyonunu çağırıyor normal de". Yanlış bir ifade.
  • 12-05-2020, 11:02:49
    #7
    emregll adlı üyeden alıntı: mesajı görüntüle
    delete()
    {
    free()
    }

    gibi yanlış bir şey anlaşılabilir yazdıklarınızdan hocam.

    delete: deallocation yapar ve destructor ı çağırır.
    free: deallocation yapar, destructor ı çağırmaz.

    #include <iostream>
    class Test {
    public:
    ~Test(){
    std::cout << "Destructor called!" << std::endl;
    }
    };
    int main()
    {
    Test* testPtr = new Test();
    free(testPtr);
    return 0;
    }
    ekrana herhangi bir şey basmazken,

    #include <iostream>
    class Test {
    public:
    ~Test(){
    std::cout << "Destructor called!" << std::endl;
    }
    };
    int main()
    {
    Test* testPtr = new Test();
    delete testPtr;
    return 0;
    }
    "Destructor called!" çıktısı üretecektir.

    "Delete operatörü direk free() fonksiyonunu çağırıyor normal de". Yanlış bir ifade.
    Yukarı da ki durumda destructoru çağırmanın bir faydası yok ekstra işlem yaptırmış oluyorsunuz boşuna free kullanmak daha mantıklı, hepsinin kullanım yeri farklıdır hangisi duruma uyuyorsa onu kullanırsınız, class destroy edildiğinde bir işlem yapılacaksa delete kullanmak en mantıklısı bu durumda öyle birşey yok.
  • 12-05-2020, 11:28:51
    #8
    oguzhane adlı üyeden alıntı: mesajı görüntüle
    Yukarı da ki durumda destructoru çağırmanın bir faydası yok ekstra işlem yaptırmış oluyorsunuz boşuna free kullanmak daha mantıklı, hepsinin kullanım yeri farklıdır hangisi duruma uyuyorsa onu kullanırsınız, class destroy edildiğinde bir işlem yapılacaksa delete kullanmak en mantıklısı bu durumda öyle birşey yok.
    Yukarıdaki durumu sadece free ve delete 'in aynı işi yapmadığını göstermek için yazdım.

    "ekstra işlem yaptırmış oluyorsunuz boşuna free kullanmak daha mantıklı,". Tamamıyla yanlış bir ifade. free ve delete birbirlerinin alternatifleri değildir ve internal yapıları birbirinden farklıdır. malloc ile allocate ettiğiniz memory'i free ile, new ile allocate ettiğiniz memory'i delete ile deallocate etmeniz gerekiyor.

    "The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. If ptr is a null pointer, no action occurs. Otherwise, if the argument does not match a pointer earlier returned by the calloc, malloc, or realloc function, or if the space has been deallocated by a call to free or realloc, the behavior is undefined.."
    -C99 Standard Chapter 7.20.3.2

    New ile ayrılmış bir dinamik memoryi free fonksiyonu ile deallocate etmek sonucu belirsiz bir durumdur, sizin compilerınızın ya da benim kullandığım compilerın bu durumda beklendiği gibi çalışması bu gerçeği değiştirmez.

    Hiçbir zaman malloc/delete ya da new/free şeklinde, bu operatorleri ve fonksiyonları karıştırıp kullanmamalısınız.

    Ekleme:

    https://isocpp.org/wiki/faq/freestor...loc-and-delete ( isocpp C++ resmi sitesi )

    Alıntı
    No! In brief, conceptually malloc and new allocate from different heaps, so can’t free or delete each other’s memory. They also operate at different levels – raw memory vs. constructed objects.
    Dediğim gibi birbirlerinin alternatifleri değiller, yapıları farklı.

    Alıntı
    Furthermore, there is no guarantee that the mechanism used by new and delete to acquire and release raw memory is compatible with malloc() and free(). If mixing styles works on your system, you were simply “lucky” – for now.
    Derleyicimizin bu karışık kullanımlarda istediğimiz gibi çalışması garanti edilen bir durum değil, o anlık şanslı olduğumuzun göstergesi.