std:: векторная проблема прерывания
Я испытываю трудности с приведенным ниже примером, последняя строка выдает ошибку "abort is found". Я не понимаю, почему это должно быть.
Я использую (*abc).def вместо abc->def для ясности в этом случае.
#include <iostream>
#include <string>
#include <vector>
class branch
{
public:
unsigned short n;
std::vector<branch> branches;
branch left()
{
return branches.at(0);
}
};
void main()
{
branch trunk = branch();
trunk.n = 0;
branch b1, b2;
b1.n = 0;
b2.n = 5;
b1.branches.push_back(b2);
trunk.branches.push_back(b1);
branch* focus1 = &(trunk.branches.at(0));
branch* focus3 = &(trunk.left());
std::cout<<trunk.left().branches.at(0).n<<std::endl; // ok
std::cout<<(*focus1).branches.at(0).n<<std::endl; // ok
std::cout<<(*focus1).left().n<<std::endl; // ok
std::cout<<(*focus3).branches.at(0).n<<std::endl; // problem
}
1 ответ
Проблема с этим кодом в том, что trunk.left()
возвращает копию ветки, а не ссылку на ветку. Следовательно, ваш focus3
Указатель указывает на временный объект, который будет немедленно очищен после завершения выполнения этой строки кода. Следовательно, при попытке разыменования focus3
в последней строке вы следите за указателем на мусорные данные, что приводит к сбою.
Чтобы это исправить, либо left
вернуть ссылку на ветку или сделать focus3
константная ссылка, которая расширяет время существования временного элемента до времени существования ссылки.