2017-12-03 1 views
0

이 중 하나가 작동하고 다른 하나는 작동하지 않는 이유에 대해 혼란 스럽습니다. 나는 (대부분) 복사 생성자가 성공 두 경우 모두, 첫 번째 지점은 사람이 여기에 갈 수 있는지에 대한 제안 사항이 않음 delete 이전 포인터를 삭제할 수 없습니다 (segfault)

if (type == controllers::Camera::Type::Arcball) { 
    controllers::Camera *old_cam = mController; 
    mController = new controllers::ArcballCamera(*old_cam); 
    delete old_cam;//!!! this segfaults 
    return true; 
} 
else if (type == controllers::Camera::Type::Fly) { 
    controllers::Camera *old_cam = mController; 
    mController = new controllers::FlyCamera(mGLFWWindow, *old_cam); 
    delete old_cam; 
    return true; 
} 

불구하고에 segfaulting되고, 카메라 컨트롤러의 스위칭을 가능하게하기 위해 노력하고있어? 두 번째 지점은 잘 작동합니다 ( delete old_cam; 수 있습니다).

+2

무언가가 충돌하지 않는다고해서 그것이 올바른 것은 아닙니다. 'mController'는 항상 스칼라의 새로운 표현식으로 만들어 졌다고 확신합니까? '카메라'는 가상 소멸자가 있습니까? – aschepler

+0

흠 당신은 분명히 뭔가에있어, ArcballCamera는 소멸자에서 실제로 아무것도 수행하는 유일한 사람입니다. 나는 그것들을 조사 할 것이고, 나는 당신이 논평 한 후에 "smartpointers 이외의"것을 추가했다. 다시 게시 할 가능성이 높습니다. 답변에 대한 의견을 말하도록 요청할 수 있습니다. :) – sjm324

답변

0

FlyCamera에서 스레드를 올바르게 종료하지 않았으므로 마지막 세그 폴트가 발생한 곳의 스레드가 this입니다. 분명해야 할 것이 무엇인지를 지적하기 위해 @aschepler에게 감사드립니다. 소멸자는 삭제 될 수 있다는 사실에서 분명해야하는 문제 였지만 다른 하나는 삭제 될 수 없었습니다!

관련 문제