У меня возникли проблемы с разработкой того, как написать класс полиморфного отжига. Я уверен, что я делаю что-то очень не так, и что это повторяющийся вопрос, но я долго искал и ничего не нашел.Segfault при вызове метода подкласса
Я хочу взять указатель на экземпляр абстрактного типа State (называемый pState) и использовать чистые виртуальные функции Perturb() (который случайно изменяет состояние бит) и Cost() (который оценивает стоимость функция), чтобы найти состояние, которое минимизирует функцию стоимости.
Мне нужно отслеживать несколько экземпляров подкласса в этой функции, и я считаю, что либо объявление, либо назначение этим переменным вызывает проблему.
void Annealer::Minimise(State *pState){
//Set up
....
....
State *state;
State *newState;
*state = *pState;
*newState = *state;
//Evaluate the initial cost
pState->Cost(); //Works just fine
double cost = state->Cost(); //Segfault
....
}
Стоимость вызова на указатель подкласса перед попыткой копирования выполнена успешно. Я не включил подкласс, потому что он очень длинный и сложный.
Edit:
государство определяется следующим образом:
class State {
public:
virtual void Perturb()=0;
virtual double Cost()=0;
};
Вы должны опубликовать исходный код класса State.Я бы предположил, что ошибка может быть связана с копированием объектов, а не с указателями в: – Anorflame
Между определением переменной 'state' и присваиванием' * state = * pState', вы делаете 'state' фактически точкой где-то действительным? Тот же вопрос с 'NewState'. Задумывались ли вы о том, чтобы эти переменные ('state' и' newState') не указали переменные? –
Как я могу сделать их точными? Я хочу избежать использования динамического распределения памяти, если это возможно. –