代码之家  ›  专栏  ›  技术社区  ›  Cyrillm_44

更改本地类名时出现SEG错误

  •  2
  • Cyrillm_44  · 技术社区  · 6 年前

    当我改变了我的班级名称,我不明白的时候,段错误就消失了。我建了一个叫做 Environ 我创建了它并称之为“主”。我发现的是,当我将main中的局部变量名从 this_environ environ 我得到一个段错误,我的环境变量都没有初始化。是否有人参与或理解为什么这会成为一个问题?有趣的是,当我在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版在Windows10上构建以下构建调用

    g++ -std=c++0x -O2 -g3 -Wall -c -fmessage-length=0
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Cyrillm_44    6 年前

    我刚发现 environ 是stdlib中的宏,因此很可能不是调用变量this的好主意。在第633行定义的宏 stdlib.h ,也许我应该提到我的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;