当我更改类(class)名称并且不理解时,段错误就消失了。我建立了一个名为Environ的类,并创建它并在主目录中调用它。我发现的是,当我将main中的局部变量名称从this_environ更改为environ时,出现了段错误,其中我的Environ变量均未初始化。有没有人参加这个 session 或了解为什么这会是一个问题?有趣的是,当我在Ubuntu计算机上进行编译时,这不是问题。

#include <vector>
#include <map>
#include <iostream>
//#include "Environ.hpp"

// Namespaces
using namespace std;

class Environ {
    public:
    // Public objects.
    vector<unsigned> years_;

    void initialise() {
          cerr << "entering initialsie" << endl;
          years_ = {12,32,23};
    }
};

int main() {
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    Environ this_environ;
    this_environ.initialise();
    cout << "Finished initialisation" << endl;
    system("PAUSE");
    return 0;
}

为了重现性,我正在使用gcc版本5.1.0在Windows 10上构建以下构建调用
g++ -std=c++0x -O2 -g3 -Wall -c -fmessage-length=0

最佳答案

我刚刚发现environ是stdlib中的宏,因此很可能不是将其称为变量的好主意。在stdlib.h的第633行定义的宏,也许我应该说我的GCC来自here

#define sys_errlist _sys_errlist
#define sys_nerr _sys_nerr
#define environ _environ
  char *__cdecl ecvt(double _Val,int _NumOfDigits,int *_PtDec,int *_PtSign) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
  char *__cdecl fcvt(double _Val,int _NumOfDec,int *_PtDec,int *_PtSign) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
  char *__cdecl gcvt(double _Val,int _NumOfDigits,char *_DstBuf) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
  char *__cdecl itoa(int _Val,char *_DstBuf,int _Radix) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
  char *__cdecl ltoa(long _Val,char *_DstBuf,int _Radix) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
  int __cdecl putenv(const char *_EnvString) __MINGW_ATTRIB_DEPRECATED_MSVC2005;

关于c++ - 我更改本地类名称时出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50557744/

10-12 17:25