2011-12-26 2 views
0

나는Connector/C++를 사용하여 코드에서 객체를 언제 릴리스합니까?

내가 finally 블록을 지원하지 않는 C++를 알고 this link에 예를 발견, 그래서 예외 데이터를 (예를 : 동안 블록에서) 검색하는 동안 발생하는 경우, 다음 Connection, Statement, 그리고 Result 객체가 될 수 없다 풀어 놓았다.

그래서 이러한 객체가 어떻게 릴리스되었는지 궁금합니다 ... 또는 코드를 작성하는 다른 방법이 있습니까?

P/S : 저는 Java, C#과 같은 다른 언어로 많은 시간을 보냈습니다. 따라서 제 생각이 잘못된 것 같습니다. 잘못하면 저를 정정하십시오.

+1

와우, 예외 처리와 관련하여 링크의 예제 코드가 너무 잘못되었습니다. 금지되어야합니다. – Frunsi

답변

3

C++에는 필요하지 않으므로 finally 블록이 없습니다. 그것은 훨씬 더 나은 것을 가지고 있습니다 : 소멸자.

클래스 유형 객체에는 인스턴스가 존재하지 않을 때 해당 클래스 유형 객체의 인스턴스에 대해 호출되는 소멸자가있을 수 있습니다. "자동 스토리지 지속 기간"이라고 불리는 로컬 변수는 선언 된 블록의 끝에 존재하지 않습니다.

따라서 자원을 관리하는 데 소멸자를 사용해야합니다. 동적으로 할당 된 객체를 파괴하기 위해 블록 끝에 delete 표현식을 작성하는 대신 스마트 포인터를 사용하여 객체의 수명을 관리해야합니다. 예를 들어, 예제 프로그램에서 다음 줄을 고려하는 당신은 연결하는 :

{ 
    sql::Connection* con; 
    // ... 
    con = driver->connect("tcp://127.0.0.1:3306", "root", "root"); 
    // ... 
    delete con; 
} 

이 대신 쓸 수로 :

{ 
    // ... 
    std::unique_ptr<sql::Connection> con(
     driver->connect("tcp://127.0.0.1:3306", "root", "root")); 
    // ... 
} // con is automatically deleted here, even if an exception is thrown. 

(당신이 이전 컴파일러 또는 C++ 표준 라이브러리 구현을 사용하는 경우 std::unique_ptr을 가지고 있지 않거나 사용할 수 없으면 std::auto_ptr을이 특정 사례에 사용할 수 있습니다.

여기에서 연결 개체의 수명은 자동으로 관리되므로 d를 기억할 필요가 없습니다. 예외를 던지면 특별한 정리를 수행하는 것에 대해 걱정할 필요가 없습니다. std::unique_ptr 소멸자는 연결 개체가 파괴되었는지 확인합니다.

소멸자를 사용하여 리소스 정리를 수행하는이 기술은 RAII (Resource Acquisition Is Initialization)이며 C++에서 일관되게 사용하고 이해하는 데 가장 중요한 관용구입니다. 리소스를 올바르게 관리하기는 어렵습니다. }이 당신을 위해 모든 노력을 기울일 때 훨씬 쉬워졌습니다.

+0

+1, RAII ;-)에 대한 메모를 추가하십시오. – Frunsi

관련 문제