C++에서 비교적 큰 프로젝트를 작성 중이며 객체 삭제에 문제가 있습니다. 이 프로젝트는 정확히는로 거의 같은 게임입니다.C++ 안전한 객체 삭제
나는 게임에서 모든 괴물 인 종류 Npc
가있다. 그것들은 관리 (로딩, 저장, 생성, 삭제 등)를 담당하는 별도의 클래스 Storage<Npc>
에 생성되어 저장됩니다. 몬스터가 죽을 때마다 해당 오브젝트 npc
을 완전히 파괴하고 파괴해야합니다. 객체 자체를 삭제하는 것은 문제가 아니며 Storage<NPC>
에서 메소드를 호출했습니다. 문제는 코드에이 포인터가 이미 많이 있음을 의미합니다. npc
은 유효하지 않으며이를 사용하려고하면 많은 문제가 발생합니다. 예 :
- 그가 죽기 전에 수행 할 작업이있을 수 있습니다.
- 그는 레코드 저장소에 포인터를 올려 놓았습니다.
- 그는 누군가를 괴롭히는 것과 같은 지속적인 활동에 참여했을 수도 있습니다.
코드에는 이러한 포인터가 많이 있으므로 추적하기가 거의 불가능합니다. 내가 필요한 것은 npc
이 이미 죽었고 그 주소에 실제 객체가 저장되어 있지 않기 때문에이 포인터를 가지고있는 코드 부분이 그의 죽음에 적절하게 반응 할 수 있도록하는 것입니다.
나 자신은 몇 가지 아이디어왔다,하지만 그들 중 지금까지 아무도 나에게 정말 좋은 것 같다 :이 같은 주소에 물체가있는 경우 내가 Storage<NPC>
클래스를 요청할 수
- . 잠재적 인 문제는 개체 삭제 후 다른 개체가 같은 주소에 할당되어 버그가 발생할 수 있다는 것입니다.
- 유효하지 않은 포인터를 사용할 수있는 모든 위치를 알릴 수 있습니다. 그러한 위치의 수가 시간이 지남에 따라 증가하고 이것이 일을하는 것이 고통이기 때문에 나쁜 생각입니다.
- 스마트 포인터의 일부 버전을 구현할 수는 있지만 사용하려는 버전이 확실하지 않습니다.
TL; DR 버전 : 나는 객체에 대한 포인터 포인트 경우 말해 것이다 솔루션이 필요하거나 메모리 무료 덩어리를 가리키는 또는 다른 개체를 원래 개체 삭제 후 할당 .
메모리가 해제/무효화 될 때마다이를 'nullptr'로 설정하는 방법은 무엇입니까? : P – SingerOfTheFall
이미 질문에 대답으로 태그를 지정했습니다. 스마트 포인터를 사용하십시오. std :: shared_ptr을 사용하는 것이 좋습니다 – stefan
@SingerOfTheFall, 당신이 말하려고하는 것은'delete pnpc;를 할 때마다'pnpc = 0;'을해야한다는 것입니다. 그러나 'pnpc'와 같은 다른 포인터가 프로그램의 다른 곳에 저장되면 t 0으로 설정되지 않으므로 작동하지 않는 것으로 보입니다. – Saage