2017-03-07 6 views
1

クラスBに、クラスAのオブジェクトへの参照を受け入れるコンストラクタがあり、そのクラスを一時的に呼び出すと、参照が無効になっているようですexample runを参照)。しかし、この状態を検出し、私が試した静的コード分析ツールのいずれ:解放された名前のないテンポラリへのアクセスを検出する

  • g++ -Wall -Wextra -pedantic
  • clang++ -Wall -Wextra -pedantic
  • cppcheck
  • clang-tidy
  • CLionの統合検査

は、私は理解して考えていませんコンパイラの動作が準拠していること標準に準拠しています。既存のコードベースでそのようなコードを検出するには?そのような難しいエラーを回避するために、どのプログラミング規則が役立つでしょうか?

完全なコード例と注釈付き出力を示します。

#include <iostream> 

class A { 
public: 
    explicit A(int i) : i_(i) { std::cerr << this << " A\n"; } 
    ~A() { std::cerr << this << " ~A\n"; } 

    void do_() const { std::cerr << this << " " << i_ << "\n"; } 

private: 
    int i_; 
}; 

class B { 
public: 
    explicit B(const A& a) : a_(a) { std::cerr << this << " B\n"; } 
    ~B() { std::cerr << this << " ~B\n"; } 
    void do_() const { std::cerr << this << " "; a_.do_(); } 

    const A& a_; 
}; 

int main(int, char**) { 
    B b(A(42)); 
    int i = 0; 
    b.do_(); 
    std::cerr << i << " main\n"; 
} 

出力:

# Construction of b 
0xffa66138 A 
0xffa66134 B 
0xffa66138 ~A 
# Calling b.do_() 
0xffa66134 0xffa66138 42 
# Printing i in main() 
0 main 
# End of main() 
0xffa66134 ~B 
+2

参照を含むクラスをメンバー変数として検索するだけです。ほとんどの場合、それはあなたが望むものではありません。正規表現はほとんどの場合を見つけることができるはずです。 –

+1

私はクラス内の参照メンバーを禁止するだけです。 – NathanOliver

+0

一時オブジェクトを禁止/禁止しても、 'B'のオブジェクトが' A'の参照オブジェクト(ダングリング参照)よりも長生きすれば、それでも問題はありませんか? – UnholySheep

答えて

2

あなたは、削除されたコンストラクタ

class B { 
public: 
    explicit B(const A& a) : a_(a) { std::cerr << this << " B\n"; } 
    B(A&&) = delete; 
// ... 
}; 

Aの寿命はBshared_ptrを取ることであろうよりも長くなっていることを保証する方法で、一時的な禁止があります。

関連する問題