Unity/트러블 슈팅

[Unity] 생성자가 오브젝트 파괴후에도 참조되는 현상

turbulence93 2025. 6. 19. 20:30

1. 문제 상황

게임 오브젝트가 파괴되었지만, 해당 오브젝트에서 생성한 클래스가 살아있어 데이터가 제대로 세팅되지 않음

 


2. 원인 분석

C#에서 new 키워드를 통해 생성된 클래스 인스턴스는 힙 메모리(Heap)에 할당되며,

해당 객체에 대한 참조가 남아있는 한 가비지 컬렉터(GC)에 의해 정리되지 않고 계속 유지된다.


3. 해결 방법

  • 오브젝트가 파괴될 때, 직접적으로 생성한 클래스 인스턴스를 명시적으로 해제하거나 null로 초기화하여 GC가 해당 인스턴스를 수거할 수 있도록 돕는다.
  • 특히 OnDestroy()나 Dispose() 등의 타이밍에서 관리하는 것이 좋다.
 
public class Inventory
{
    private ItemData[] items = new ItemData[100];
}

public class Player : MonoBehaviour
{
    private Inventory playerInventory;

    private void Start()
    {
        playerInventory = new Inventory(); // new로 생성됨
    }

    private void OnDestroy()
    {
        playerInventory = null; // 참조 해제 (명시적 해제 필요)
    }
}

4. 개인적인 생각

new로 생성된 인스턴스는 눈에 보이지 않더라도 메모리에 남아있다는 점을 다시금 상기하게 되었다.
Unity에서 GC가 있어서 이런 경우가 생길거라고 생각을 못했는데, 너무 안일하게 작업을 한거 같다.
메모리 관리에 조금 더 신경써줘야겠다.