почему элемент указателя инициализирован ненулевым?

0

Я наткнулся на странную вещь, которую я не могу объяснить. По умолчанию указатель не инициализируется нулем (это происходит только во второй раз). Я знаю, что забыл инициализировать его в конструкторе и освободить память в 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
}
Теги:
pointers
memory-leaks

2 ответа

7
Лучший ответ

But я cannot explain why the pointer is not initialized to a zero by default. - как работает C++. Это не инициализировано ни к чему. Если оставить часть инициализации, вы явно заявили, что не хотите, чтобы она была инициализирована.

  • 0
    Спасибо, я думал, что он будет инициализирован нулем по умолчанию. :-) Но почему член p инициализируется в моем примере выше? (Я использую g ++ 4 кстати)
  • 0
    @ Запускать второй раз, когда вы запускаете ub потому что вы a доступ к a->p после того, как удалили a .
Показать ещё 3 комментария
1

Если это не сделано явно, ваши члены встроенных типов не инициализируются нулем

Ещё вопросы

Сообщество Overcoder
Наверх
Меню