【问题标题】:Warning about hiding member variables?关于隐藏成员变量的警告?
【发布时间】:2009-05-26 17:05:49
【问题描述】:

下面的代码sn-p有内存泄漏,我花了太多时间追下来。问题是在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.
}

【问题讨论】:

  • 有几个人提到你应该只使用纯字符串对象而不是指针和动态分配——他们是对的。如果(我怀疑)你真的想知道如何让编译器在你声明一个隐藏成员变量的局部变量时警告你,我建议澄清你的问题。
  • 因为你有指针作为成员变量,请记住提供复制构造函数和赋值运算符。
  • 如果不提供它们,那么至少取消默认值。

标签: c++ gcc


【解决方案1】:

使用 -Wshadow。

顺便说一句,-W 和 -Wall 都不能启用 -Wshadow。

很高兴让编译器帮助避免此类问题,但如果您使用有助于避免首先创建它的约定(例如为成员变量保留 x_ 形式的名称),这甚至是不必要的,而不是局部变量。

【讨论】:

  • 在我看来,OP 有这样的约定,但有一个“thinko”并输入了“string* x_ =" 而不是实际预期的 "x_ ="。
  • 恕我直言,让您的编辑器以对比的方式突出显示局部变量和成员变量比在名称中添加匈牙利疣要好得多。
  • @rmeador。我很抱歉,但这是一个非常危险的说法。如果您需要编写要移植到其他平台的代码,您根本无法相信所有编辑器都会这样做。编写尽可能健壮的代码总是最好的。
  • 可悲的是,-Wextra 都没有启用此警告。一个人应该知道它的存在并使用它。也许我们需要-Wextra2 之类的东西?
【解决方案2】:

FWIW 我不会有这个问题,因为我使用命名约定来区分成员数据和局部变量:我的成员数据标识符总是以 m_ 为前缀。

【讨论】:

  • 私有成员函数的约定也很常见。它有助于在一秒钟内快速清晰地捕捉到私密内容。
  • 并且没有人在处理代码时犯过复制和粘贴错误?哇。
【解决方案3】:

我们在名字的开头使用这些疣 - 一个参数 d_ 数据成员 s_ 类中的静态数据 f_ 文件中的静态数据

...而且局部变量没有缺点。

真的,Lakos 书​​是你的朋友。

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    相关资源
    最近更新 更多