Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;一个平台(MacOSX)上的SEGFULT,而另一个平台(linux)上的SEGFULT_C++_Linux_Macos_Gcc_Llvm - Fatal编程技术网

C++ c++;一个平台(MacOSX)上的SEGFULT,而另一个平台(linux)上的SEGFULT

C++ c++;一个平台(MacOSX)上的SEGFULT,而另一个平台(linux)上的SEGFULT,c++,linux,macos,gcc,llvm,C++,Linux,Macos,Gcc,Llvm,我在MacOSX上得到了一个segfault(“Segmentation fault:11”,在gdb“Program received signal SIGSEGV,Segmentation fault”)出现在析构函数中,在析构函数中,容器被循环,迭代器和内存被删除。我试过使用clang++、g++(都是LLVM的一部分)和自制的g++。当迭代器第一次递增时,会出现segfault,带有gdb消息(已使用clang++编译) “标准中的0x000000010001196d::\uu 1::\

我在MacOSX上得到了一个segfault(“Segmentation fault:11”,在gdb“Program received signal SIGSEGV,Segmentation fault”)出现在析构函数中,在析构函数中,容器被循环,迭代器和内存被删除。我试过使用clang++、g++(都是LLVM的一部分)和自制的g++。当迭代器第一次递增时,会出现segfault,带有gdb消息(已使用clang++编译)

“标准中的0x000000010001196d::\uu 1::\uu树节点\u基*标准::\uu 1::\uu树\u下一步(标准::\uu 1::\uu树节点\u基*)()”
当在gdb中启动程序时,我还收到警告:“警告:无法打开OSO存档文件”

在使用GCC4.8.1的集群linux节点上,我没有遇到SEGFULT。有什么想法可能是错误的,我可以如何避免我的mac上的SEGFULT(最好是与叮当)?我真的不太了解编译器之类的东西


编辑:


我想我发现了问题所在,但是我仍然想理解为什么这在一个平台上有效,而在另一个平台上无效。下面是一个简单的例子:

类词:

#ifndef WORD_H
#define WORD_H

#include <string> 
#include <map>

class Word {

    public:
        /*** Constructor ***/
        Word(std::string w) : m_word(w) {
            // Add word to index map, if it's not already in there
            std::map<std::string, Word*>::iterator it = index.find(w);
            if (it == index.end()) {
                index[w] = this;
            }
        }
        ~Word() { index.erase(m_word); } // Remove from index
        static void DeleteAll() {   // Clear index, delete all allocated memory
            for (std::map<std::string, Word*>::const_iterator it = index.begin();
            it != index.end();
            ++it)
            { delete it->second; }
        }

    private:
        std::string m_word;
        static std::map<std::string, Word*> index; // Index holding all words initialized
};
#endif
\ifndef WORD\u H
#定义单词
#包括
#包括
类词{
公众:
/***建造师***/
单词(标准::字符串w):m_单词(w){
//将单词添加到索引映射中,如果它还不在索引映射中
std::map::iterator it=index.find(w);
if(it==index.end()){
索引[w]=此;
}
}
~Word(){index.erase(m_Word);}//从索引中删除
静态void DeleteAll(){//清除索引,删除所有分配的内存
对于(std::map::const_迭代器it=index.begin();
it!=index.end();
++(it)
{删除它->第二;}
}
私人:
std::字符串m_字;
静态std::map index;//保存所有已初始化单词的索引
};
#恩迪夫
WordHandler类:

#ifndef _WORDHANDLER_H_
#define _WORDHANDLER_H_
#include <string>
#include "Word.h"
class WordHandler {
    WordHandler() {}     
    ~WordHandler() { Word::DeleteAll(); }   // clear memory

    void WordHandler::NewWord(const std::string word) {
         Word* w = new Word(word);
    }
};
#endif
\ifndef\u WORDHANDLER\u H_
#定义单词处理程序_
#包括
#包括“Word.h”
类字处理程序{
WordHandler(){}
~WordHandler(){Word::DeleteAll();}//清除内存
void WordHandler::NewWord(const std::string word){
单词*w=新词(单词);
}
};
#恩迪夫
主程序:

#include <iostream>
#include "WordHandler.h"

int main () {

    std::cout << "Welcome to the WordHandler. " << std::endl;
    WordHandler wh;
    wh.NewWord("hallon");
    wh.NewWord("karl");

    std::cout << "About to exit WordHandler after having added two new words " << std::endl;
    return 0;
}
#包括
#包括“WordHandler.h”
int main(){
这是一个问题:

    ~Word() { index.erase(m_word); } // Remove from index
    static void DeleteAll() {   // Clear index, delete all allocated memory
        for (std::map<std::string, Word*>::const_iterator it = index.begin();
        it != index.end();
        ++it)
        { delete it->second; }
    }
~Word(){index.erase(m_Word);}//从索引中删除
静态void DeleteAll(){//清除索引,删除所有分配的内存
对于(std::map::const_迭代器it=index.begin();
it!=index.end();
++(it)
{删除它->第二;}
}
delete it->second
调用
~Word
,它将从您正在迭代的映射中删除。这将使您的活动迭代器无效,导致未定义的行为。因为它是UB,它在一个平台上工作而不是在另一个平台上工作基本上只是运气(或缺乏运气)


修复此代码时,您可以复制<代码>索引>代码>并重复此操作,考虑在删除该索引时不改变索引的不同设计,或者使用<代码>擦除< /代码>返回下一个有效迭代器以使循环安全(这意味着将<代码>擦除<代码> > <代码> DeleTeAlvie<代码>.

您可能有,但在看不到相关代码的情况下,很难说出更具体的内容。请创建一个并向我们展示。您是否删除迭代器指向的对象,然后尝试增加它?可能是重复的
    ~Word() { index.erase(m_word); } // Remove from index
    static void DeleteAll() {   // Clear index, delete all allocated memory
        for (std::map<std::string, Word*>::const_iterator it = index.begin();
        it != index.end();
        ++it)
        { delete it->second; }
    }