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