4

다음 정보가 유효합니까?C++ 초기화 목록 및 메모리 할당

class myClass 
{ 
    private: 
    ... 
    int m_nDataLength; 
    boost::shared_array<int> m_pData; 
    ... 

    public: 
    myClass(): ..., m_nDataLength(10), m_pData(new int[m_nDataLength]), ... 
    { 
    } 
} 

맞죠 초기화가 I가 ctor에 주어진 한 순서대로 정확히 일어날 가정에서? 그렇지 않다면, m_pData의 뒤에 m_nDataLength의 초기화가 발생합니다.

+2

이 http://stackoverflow.com/questions/1242830/constructor-initialization-list-evaluation-order를 참조하십시오. –

+0

나는이 하나를 알아 차리지 못했다. 나의 질문은 이것과 중복되는 것으로 보인다. Luc에게 알려 주셔서 감사합니다. – legends2k

답변

10

는, 당신이 생각하는 이유에 대해이 아니다 : 초기화 데이터 멤버 클래스 정의에 선언의 순으로 발생합니다.이 이유는 소멸자가 개체를 만드는 데 사용 된 생성자와 관계없이 역순으로 멤버를 파괴해야하기 때문입니다. 이를 위해서는 건설 순서를 정의하는 생성자와 무관 한 방식을 사용해야합니다.

class myClass 
{ 
    private: 
    ... 
    int m_nDataLength; 
    boost::shared_array<int> m_pData; 

사람이 다음 코드는 버그가있을 것

class myClass 
{ 
    private: 
    ... 
    boost::shared_array<int> m_pData; 
    int m_nDataLength; 

에 코드를 변경 것이라고 경우 대신

의미

.

내 조언은 다음과 같습니다 initialiszation 순서는 중요하지 않도록

  • 이 생성자를 작성합니다.
  • 이렇게 할 수없는 경우 (메모 : 지난 10 년간 5 번 미만이 발생 했음) 데이터 멤버가 선언 된 시점에서 완전히 삭제되었습니다. 이 같은

뭔가 수행해야합니다

class myClass 
{ 
    private: 
    ... 
    int m_nDataLength;     // Note: Declaration order 
    boost::shared_array<int> m_pData; //  matters here! 
+0

와우, 모든 답변을 주셔서 감사합니다. 그것은 성가신 문제를 고쳤고 나를 위해 눈을 뜨게했습니다. :) 그러나 나는 이것을 하나의 세부 사항으로 뽑았습니다. – legends2k

9

초기화 때문에, 클래스의 순서에 따라 필드를 초기화합니다 : 당신이

private: 
    ... 
    int m_nDataLength; 
    boost::shared_array<int> m_pData; 

private: 
    ... 
    boost::shared_array<int> m_pData; 
    int m_nDataLength; 

로 늘 일을 변경하는 경우. 생성자에서 순서는 적용되지 않습니다.

5

아니요, 클래스 멤버에 대한 초기화는 멤버가 클래스 정의에 나타나는 순서대로 수행됩니다. 멤버가 이니셜 라이저 목록에 나타나면이 멤버는 초기화되지 않은 멤버를 사용하더라도 해당 멤버를 초기화하는 데 사용되는 표현식을 제어하지만 이니셜 라이저 목록에 나타나는 위치는 초기화 될 때 영향을주지 않습니다. 귀하의 예제에서 초기화가 원하는 순서대로 일어날 않지만