2012-04-26 2 views
3

클래스의 멤버로 사용되는 구조체에 대한 포인터와 혼동을 없애려하고 있습니다. 나는 다음 코드를 썼다. 그러나 비록 프로그램이 컴파일 되더라도 그것은 충돌한다. 다음 코드에서 내가 뭘 잘못하고 있는지 말할 수 있을까요?c/C++에서 구조체에 대한 포인터와의 혼동

#include<stdio.h> 
#include<string.h> 

struct a{ 
    int s; 
    int b; 
    char*h; 
}; 

class test 
{ 
public: 
    a * f; 
    void dh(); 
    void dt(); 
}; 

void test::dh() 
{ 
    a d; 
    d.s=1; 
    d.b=2; 
    d.h="ffdf"; 
    f=&d; 
} 

void test::dt() 
{ 
    printf("%s %d %d",f->h,f->b,f->s); 
} 

int main() 
{ 
    test g; 
    g.dh(); 
    g.dt(); 
    return 0; 
} 
+1

Google의 규칙은 3입니다. 그런 다음 스마트 포인터를 대신 사용하십시오. –

답변

8
void test::dh() 
{ 
    a d; <-- 
    d.s=1; 
    d.b=2; 
    d.h="ffdf"; 
    f=&d; <-- 
} 

당신은 로컬 객체, d를 생성하고이 객체의 주소로 f을 설정하고 있습니다. 함수가 끝나면 객체는 범위를 벗어나 매달린 포인터가 남습니다.

4

가장 큰 문제는 dh()이 반환 할 때까지 d이 더 이상 존재하지 않는다는 것입니다. a d; 대신 dh()f = new a(); f.s=1; f.b=2, f.h="ffdf";이 필요합니다.

+0

f = new a()라고 선언하여 메모리 문제가 발생할 수 있습니까? –

+2

@the_naive 해당하는'delete'가있는 한, 당신은 좋습니다. 걱정되는 경우 또는 그렇지 않은 경우 스마트 포인터를 사용하는 것을 고려하십시오. 그들은 당신을 위해 기억을 해방 할 것입니다. – chris

+2

@ the_naive, 기술적으로 예. 올바른 것이므로, 코드는'f '를 할당하는 것이 실패 할 수 있다고 예상해야한다. 실제로이 작은 데이터 구조를 가진 작은 프로그램에서는이 작은 것이 나오지 않을 것입니다. 항상 점검하는 습관이 있어야하지만 복구 할 수있는 확실한 방법이 없다면 때때로 충돌 사고를 극복하는 것이 가장 좋습니다. – sblom

2

test :: dh에서 로컬 포인터 인 d의 주소를 공용 포인터 f로 지정합니다. g.dh();이 종료되면 d의 주소는 더 이상 유효하지 않으므로 g.dt();에있는 f에 대한 참조가 실패합니다.