2016-04-09 13 views
-1

biz C++ kod takip eden kısım var varsayalım:oluşan yapıların hafızasını boşaltmak için doğru yolu

struct A 
{ 
    int* a; 
    A() 
    { 
     a = new int(5); 
    } 

    ~A() 
    { 
     delete a; 
    } 
}; 

struct B 
{ 
    A a; 
    int b; 

    B() 
    { 
     a = A(); 
     b = 10; 
    } 
}; 

int main() 
{ 
    B b; 

    return 0; 
} 

çalıştırmaya, A'nın yıkıcı iki kez denilen, ama neden olur? B'nin ima ettiği şeyden, örtülü yıkıcı, B üyelerinin tüm yıkıcılarını arar, ki bu iyi bir şeydir, fakat ikinci kez A'nın yıkıcısı için çağrı ne zaman yapılır? Bu gibi durumlarda belleği işlemenin doğru yolu nedir? Veri üyeleri için kurucular, sınıfınızın yapıcısında

+1

bir debuger olmadan bile elle, bu hata ayıklamak lütfen ve daha fazla anlayacaksınız: 'a = A();' –

cevap

0

kurucularından çağrılmaktadır. Bir yürütücüyü bir başlatıcı listesi kullanarak açıkça belirtmedikçe, yapıcının çağrılmasından önce her üye için varsayılan kurucu çağrıcının ilk satırına ulaşır. yıkıcı burada ilk kez adı verilecek

#include <iostream> 
#include <stdlib.h> 
struct A 
{ 
    int* a; 
    A() 
    { 
     a = new int(5); 
     std::cout<<"A()"<<std::endl; 
    } 

    ~A() 
    { 
     std::cout<<"~A()"<<std::endl; 
     delete a; 
    } 
}; 

struct B 
{ 
    A a; // if you remove this & you remove line 26 there wont be any call to A() 
    int b; 

    B() 
    { 
    // a = A(); // even if this line is removed there still a call to A() constructor 
     b = 10; 
    } 
}; 
void pause() // a simple pause function , that we let the system call before exiting to see the output 
{ 
    system("pause"); 
} 
int main() 
{ 
    atexit(pause); // to pause after calling all destructors 
    B * b = new B(); 
    delete b; 
    B * b1 = new B(); 
    delete b1; 
    return 0; 
} 
İlgili konular