Предупреждение о скрытии переменных-членов? - PullRequest
8 голосов
/ 26 мая 2009

В следующем фрагменте кода есть утечка памяти, которую я потратил слишком много времени на поиски. Проблема в том, что внутри Foo () локальная переменная x_ скрывает переменную-член x_. Это тоже довольно раздражает, потому что компилятор мог предупредить меня об этом. Есть ли в GCC флаг для такого предупреждения? (Для любопытных: я пришел к ошибочному коду, используя сначала локальную переменную, затем изменив ее на переменную-член, но забыв удалить объявление типа.)

struct A {
  A() x_(NULL) {}

  ~A() {
    delete x_;
  }

  void Foo() {
    HugeThingy* x_ = new HugeThingy();
    x_->Bar("I. Need. Garbage. Collection. Now.");
  }

  HugeThingy* x_;

  DISALLOW_COPY_AND_ASSIGN(A);  // Macro to prevent copy/assign.
}

Ответы [ 3 ]

26 голосов
/ 26 мая 2009

Использовать -Wshadow.

Кстати, ни -W, ни -Wall не активируют -Wshadow.

Приятно, что компилятор помогает избежать такого рода проблем, но в этом даже нет необходимости, если вы используете соглашения, которые в первую очередь помогают избежать его создания, такие как резервирование имен формы x_ для переменных-членов , не локальные переменные.

5 голосов
/ 26 мая 2009

FWIW У меня не было бы этой проблемы, потому что я использую соглашение об именах, чтобы отличать данные члена от локальных переменных: мои идентификаторы данных члена всегда имеют префикс m_.

0 голосов
/ 27 мая 2009

Мы используем эти бородавки в начале имен - аргумент элемент данных d_ s_ статические данные в классе f_ статические данные в файле

... и нет бородавок для локальных переменных.

Поистине, книга Лакос - твой друг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...