2014-02-01 4 views
3

Я изучаю новый стандарт C++ 11 и записываю маленькую игру в SFML. Я выполнил код, где я пытаюсь передать указатель спрайта на другой объект.unique_ptr - неверный указатель и segfault

bool Game::detectCollision() 
{ 
    std::unique_ptr<sf::Sprite> sprPtr1(&iPlayer.charSprite); 
    return field.detectCollision(sprPtr1); 
} 

bool FieldElem::detectCollision(std::unique_ptr<sf::Sprite> charSprite) 
{ 
    std::cout << "X: " << charSprite->getPosition().x << std::endl; 
    return true; 
} 

Этот код компилируется без предупреждения и дает мне следующее Segfault во время выполнения:

*** glibc detected *** ./game: munmap_chunk(): invalid pointer: 0x00007fffb8617d90 *** 
======= Backtrace: ========= 
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7f8694b37b96] 
./game(_ZN2sf6SpriteD0Ev+0x24)[0x405772] 

Почему мой указатель является недействительным? Я думаю, что мне не хватает важной информации о unique_ptr ...

+0

Был ли 'charSprite' выделен с использованием' new'? –

+2

Ваш код не должен компилироваться, так как 'std :: unique_ptr' не может быть скопирован, доступен только для перемещения. – Sean

ответ

7

std::unique_ptr принимает единоличное право собственности на объект с указателем на объект и удаляет объект, когда unique_ptr выходит за рамки. Поэтому после того, как detectCollision возвращается, charSprite удален. Так как вы никогда не выделяли charSprite (но скорее выделили iPlayer, с charSprite), это не кошер.

Похоже, вы действительно не хотите unique_ptr здесь. Вы не намерены передавать право собственности.

+0

Да, правильно - спасибо, что указали это. Поэтому в этом случае он был уничтожен из-за выхода из сферы действия. Однако, когда я пытался использовать shared_ptr, я тоже получал segfault - почему ?. Он работает с обычным указателем ... – bluszcz

+0

Вы, вероятно, тоже не хотите 'shared_ptr'. Это однострочная функция, без сохранения права собственности. Что не так с обычными указателями? – Sneftel

+0

То, что я хотел достичь, - это попытаться понять ограничения (почему это segfaults) с помощью умных указателей. – bluszcz

Смежные вопросы