나는 설명 할 수없는 이상한 것을 발견했다. 포인터 멤버는 기본적으로 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
}
'기본적으로'포인터는 초기화되지 않습니다. 수동으로 초기화하지 않았다면 아무 것도 될 수 있습니다 (디버그 빌드의 경우 null이 아닌 것으로 알려져 있고 릴리스의 경우 임의의 가비지) – keltar
변수를 초기화해야합니다. –
왜냐하면'int * p'를 사용하기 때문에 당신이하는 일이 정의되지 않은 행동 인'int * p = NULL'을 사용하는 것이 더 낫습니다. – Najzero