Я наткнулся на странную вещь, которую я не могу объяснить. По умолчанию указатель не инициализируется нулем (это происходит только во второй раз). Я знаю, что забыл инициализировать его в конструкторе и освободить память в d-tor. Но я не могу объяснить, почему указатель не инициализирован нулем по умолчанию. Ниже приведен псевдокод, который РАБОТАЕТ. Я отправил его, чтобы показать вам, что я имею в виду. В моем реальном коде это намного сложнее.
До сих пор я догадываюсь, что где-то есть утечка памяти. Я хотел бы услышать от вас, если есть больше возможностей. Благодарю.
#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
}
But я cannot explain why the pointer is not initialized to a zero by default.
- как работает C++. Это не инициализировано ни к чему. Если оставить часть инициализации, вы явно заявили, что не хотите, чтобы она была инициализирована.
Если это не сделано явно, ваши члены встроенных типов не инициализируются нулем
ub
потому что выa
доступ кa->p
после того, как удалилиa
.