2016-11-25 8 views
2

Я использую динамическое выделение в первый раз, и компилятор дает мне это предупреждение, которое я не мог найти где-нибудь еще:Предупреждения при динамическом выделении памяти

warning: non-static data member initializers only available with 
-std=c++11 or -std=gnu++11 

Есть ли способ сделать это desappear? Мне все равно? Спасибо!

+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++ 98) (например, вы настроили таргетинг на какую-либо систему, где нет компилятора C++ 11).

Мне все равно?

Абсолютно, да. Отсутствие внимания к предупреждениям может привести ко многим проблемам, таким как переполнение и неопределенное поведение.

+0

Я ничего не знал о флагом -std = C++ 11, я предопределю его использовать! Спасибо! –

3

Всегда заботиться о предупреждениях! Предупреждения полезны, на самом деле, вы всегда должны компилироваться с помощью -Werror.

Это предупреждает вас, что вы компилируете в предварительно C++ 11, но с использованием C++ 11 в классе инициализаторами в коде:

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

Вы должны компилировать с -std=c++11 , или прекратить использование этой функции и инициализировать элементы данных в конструкторе.