Я довольно новичок в языке C++, и я пытаюсь написать рекурсивный метод для перемещения по дереву. У меня есть метод перемещения, но есть одна строка кода, которая вызывает ошибку сегментации. Я проверил это, комментируя и раскомментируя строку, компилируя и выполняя. Я исследовал причину возникновения ошибок сегментации и не понимаю, почему любое из того, что я делаю, вызывает проблему с памятью. Может ли кто-нибудь дать мне совет о том, что я делаю неправильно?Ошибка сегментации C++
map<int, Node> theNodes;
void initialize()
{
// first we read the data
while (inStream.hasNext())
{
string nextLine = inStream.nextLine();
Node newNode = Node(nextLine);
this->theNodes[newNode.getSequence()] = newNode;
}
}
Код для getDownLinks() и getSequence
vector<int> downLinks;
int sequence;
vector<int> Node::getDownLinks() const
{
return this->downLinks; //
}
int Node::getSequence() const
{
return this->sequence;
}
Прослеживание Код класса
int totalPayoff;
Node headNode;
int Traversal::traverse()
{
Node headNode = theNodes[0];
std::vector<int> downLinks = headNode.getDownLinks();
for(int i = 0; i < downLinks.size(); i++)
{
int a = 0;
Node currentNode = theNodes[downLinks[i]];
traverseInner(a, currentNode);
}
return this->totalPayoff;
}
Вот функция traverseInner
int Traversal::traverseInner(int& level, Node& node)
{
std::vector<int> nodeDownLinks = node.getDownLinks();
if(nodeDownLinks.size() == 0)
{
totalPayoff = totalPayoff + node.getPayoff();
return 0;
}
for(int i = 0; i < nodeDownLinks.size(); i++)
{
int a = 0;
Node currentNode = theNodes[nodeDownLinks[i]]; <-- This causes segmentation error.
traverseInner(a, currentNode);
}
return totalPayoff;
}
Любые переменные, которые не объявлены здесь, объявляются в файле заголовка. Код компилируется отлично.
Я также хотел бы упомянуть, что я написал этот код по-разному, и благодаря моим наблюдениям пришел к выводу, что к любой переменной, которая пытается получить доступ к фигурным скобкам вложенного оператора, нельзя получить доступ память. Даже int a переменная, которая объявлена прямо над оператором проблемы и даже жестко закодированные данные, которые должны быть там, такие как nodeDownLinks. Если я попытаюсь распечатать через стандартный вывод размер вектора внутри одного из вложенных операторов, я также получу ошибку сегментации.
'getDownLinks()' если это возвращает член, а не локальную переменную, вы можете вернуть его по ссылке const и сохранить результат как 'const std :: vector & downLinks', если вам не нужно изменять Это. Это спасет копирование вектора. –
Вы пытались запустить его через GDB? Можете ли вы опубликовать код 'node.getDownLinks()'? –
Где инициализируется или заполняется 'theNodes'? Очевидно, вы пытаетесь получить доступ к индексу вне пределов. – Falmarri