2016-11-25 5 views
2

를 할당? 내가 신경 써야 할까? 감사합니다.경고 할 때 동적으로 내가 처음으로 동적 할당을 사용하고 있는데 컴파일러는 나에게 내가 다른 곳에서는 찾을 수 없습니다이 경고를 준다 메모리

+5

경고 외에도이 문제를 일으키는 코드를 게시해야합니다. –

+2

"-std = C++ 11"의 어느 부분이 불분명합니까? –

+4

예, 경고에주의해야합니다. 컴파일 명령에 맹목적으로 플래그를 추가하여 경고가 사라지게하기 전에 컴파일러에서 경고하는 문제의 성격을 이해해야합니다. –

답변

5

문제 :

그것은 동적 할당과는 아무 상관이 없습니다.

당신은 아마 C++ (11)의 일부 데이터 멤버 초기화에 대해이 방법 중 하나를 사용하는

:

class S 
{ 
    int n;    // non-static data member 
    int& r;    // non-static data member of reference type 
    int a[10] = {1, 2}; // non-static data member with initializer (C++11) 
    std::string s, *ps; // two non-static data members 
    struct NestedS { 
     std::string s; 
    } d5, *d6;   // two non-static data members of nested type 
    char bit : 2;   // two-bit bitfield 
}; 

Source

컴파일러는이 기능을 사용하고 있음을 알려줍니다 (비 정적 데이터 멤버 이니셜 라이저)는 C++ 11 이상에서만 존재합니다.

  • 당신은 단순히 -std=c++11 플래그를 사용하여 코드를 컴파일 할 수 있습니다

    문제를 해결.

  • 또는 C++ 11 컴파일러를 사용할 수없는 시스템을 타겟팅하는 것과 같은 이유로 일부 표준 (예 : C++ 98)을 사용하려는 경우이 기능을 사용하지 않아도됩니다.

내가 신경 써야할까요?

물론 그렇습니다. 경고에주의를 기울이지 않으면 오버플로 및 정의되지 않은 동작과 같은 많은 문제가 발생할 수 있습니다.

+0

-std = C++ 11 플래그에 대해 아무 것도 몰라, 나는 그것을 defenetely 사용할 것이다! 고맙습니다! –

3

항상 경고에주의하십시오! 경고는 유용합니다. 실제로는 항상 -Werror으로 컴파일해야합니다.

당신이 사전 C++ 11에서 컴파일 있음을 경고하고 있지만, 코드에서 C++ 11 수준의 이니셜 라이저를 사용 :

struct foo { 
    int i = 0; // initialization of non-static POD 
}; 

당신은 -std=c++11 컴파일해야합니다 해당 기능의 사용을 중지하고 생성자에서 데이터 멤버를 초기화합니다.