2013-10-10 2 views
0

나는 설명 할 수없는 이상한 것을 발견했다. 포인터 멤버는 기본적으로 0으로 초기화되지 않습니다 (두 번째에만 발생 함). 생성자에서 초기화하고 dtor에서 메모리를 해제하는 것을 잊었습니다. 하지만 왜 포인터가 기본적으로 0으로 초기화되지 설명 할 수 없습니다. 아래는 작동하는 의사 코드입니다. 나는 당신들에게 내가 말하는 것을 보여주기 위해 그것을 올렸다. 제 실제 코드에서는 훨씬 더 복잡합니다.왜 포인터 멤버가 0이 아닌 값으로 초기화 되었습니까?

내 생각 엔 지금까지 메모리 누수가있는 것 같습니다. 더 많은 가능성이 있다면 당신의 의견을 듣고 싶습니다. 감사.

#include <iostream> 

class A { 
public: 
    int *p; 
    A() {std::cout << "p in ctor: " << p << std::endl;} 
    ~A() {} 
    void f(int *i) { p = i;} 
}; 

int main() { 
    A *a = new A(); 
    int c = 0; 
    a->f(&c); 
    std::cout << "p in step 1:" << a->p << std::endl; 
    delete a; 
    A *b = new A(); 
    std::cout << "p in step 2:" << a->p << std::endl;//here works but not in real code 
} 
+3

'기본적으로'포인터는 초기화되지 않습니다. 수동으로 초기화하지 않았다면 아무 것도 될 수 있습니다 (디버그 빌드의 경우 null이 아닌 것으로 알려져 있고 릴리스의 경우 임의의 가비지) – keltar

+0

변수를 초기화해야합니다. –

+0

왜냐하면'int * p'를 사용하기 때문에 당신이하는 일이 정의되지 않은 행동 인'int * p = NULL'을 사용하는 것이 더 낫습니다. – Najzero

답변

7

But I cannot explain why the pointer is not initialized to a zero by default. - 이것이 바로 C++의 작동 방식입니다. 그것은 아무것도 초기화되지 않았습니다. 초기화 부분을 생략함으로써 명시 적으로 초기화하지 않도록 명시했습니다.

+0

고마워, 나는 기본적으로 0으로 초기화 될 것이라고 생각했다. :-)하지만 왜 위의 예제에서 멤버 p가 초기화 되었습니까? (나는 g ++ 4 BTW를 사용하고있다.) – Orunner

+0

@Orunner'a'를 삭제 한 후에'a-> p'에 접근하기 때문에'ub'를 두 번째로 실행한다. –

+0

"Plain Old Data"(POD) 유형 (예 : 포인터)은 기본 생성자가 명시 적으로 호출되지 않는 한 제로화되지 않습니다. 당신이 생성자를'A() : p() {std :: cout << "p로 대체한다면 ctor :"<< p << std :: endl;} "은 0으로 초기화되어야합니다. – Medinoc

1

명시 적으로 수행하지 않으면 기본 제공 멤버가 0으로 초기화되지 않습니다.

관련 문제