2017-03-07 12 views
1

에 대한 액세스 검색 A 클래스의 개체에 대한 참조를 허용하는 생성자가 클래스 B에 있고 해당 클래스의 임시로 호출되는 경우 생성자가 완료되면 참조가 유효하지 않은 것으로 보입니다 (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의 수명이 더 긴 B보다 긴 shared_ptr을하는 것입니다 보증 할 수있는 방법으로 일시적으로 금지 할 수있다.