动态分配内存时的警告

Posted

技术标签:

【中文标题】动态分配内存时的警告【英文标题】:Warning when dynamically allocating memory 【发布时间】:2016-11-25 21:36:29 【问题描述】:

我第一次使用动态分配,编译器给了我这个在其他任何地方都找不到的警告:

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

有没有办法让它消失?我应该关心吗? 谢谢!

【问题讨论】:

除了警告之外,您还需要发布导致此问题的代码。 “-std=c++11”的哪一部分不清楚? 是的,您应该关心警告。在盲目地在编译命令中添加标志以使警告消失之前,您应该了解编译器警告的问题的性质。 【参考方案1】:

问题:

动态分配无关

您可能正在使用其中一种方法进行数据成员初始化,它是 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 编译器可用的系统),则可以避免使用此功能。

我应该关心吗?

当然,是的。不注意警告可能会导致许多问题,例如溢出和未定义的行为。

【讨论】:

我对 -std=c++11 标志一无所知,我一定会使用它!谢谢!【参考方案2】:

始终关心警告!警告很有用,事实上,您应该始终使用-Werror 进行编译。

警告您正在使用 C++11 之前的版本进行编译,但在代码中使用了 C++11 类内初始化程序:

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

您必须使用-std=c++11 进行编译,或者停止使用该功能并在构造函数中初始化数据成员。

【讨论】:

以上是关于动态分配内存时的警告的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB简单使用

声明变量以保存字符串列表时的内存分配

在 cuda 中使用静态分配的内存时的全局设备内存大小限制

动态分配数组时的C ++ new vs new [] [重复]

c语言中啥是动态分配内存?

C语言中的动态内存分配的用法举例