Skip to content

[Title] Issue #102: Illegal Reference to Deleted Copy Constructor in SceneView (C2280) #4

@Winteradio

Description

@Winteradio

0. Build Error

  SceneView.cpp

C:\Users\Winteradio\Desktop\Project\Game-Engine\external\Container\include\DynamicArray.h(366,27): error C2280: 'wtr::SceneView::SceneView(const wtr::SceneView &)': 삭제된 함수를 참조하려고 합니다. [C:\Users\Winteradio\

Desktop\Project\Game-Engine\build\GameEngine.vcxproj]

  (소스 파일 '../Engine/Private/Framework/FrameView.cpp'을(를) 컴파일하는 중)

      C:\Users\Winteradio\Desktop\Project\Game-Engine\Engine\Private\Framework\SceneView.h(44,2):

      컴파일러에서 여기에 'wtr::SceneView::SceneView'을(를) 생성했습니다.

      C:\Users\Winteradio\Desktop\Project\Game-Engine\Engine\Private\Framework\SceneView.h(44,2):

      'wtr::SceneView::SceneView(const wtr::SceneView &)': 데이터 멤버이(가) 삭제되거나 액세스할 수 없는 'wtr::ProxyList<wtr::MeshProxy>::ProxyList(const wtr::ProxyList<wtr::MeshProxy> &)' 함수를 호출하므로 함수가 암시적으로 삭제되었습니다.

      C:\Users\Winteradio\Desktop\Project\Game-Engine\Engine\Private\Renderer\Proxy\ProxyList.h(58,1):

      'wtr::ProxyList<wtr::MeshProxy>::ProxyList(const wtr::ProxyList<wtr::MeshProxy> &)': 기본 클래스이(가) 삭제되거나 액세스할 수 없는 'wtr::CommandList<ProxyBase>::CommandList(const wtr::CommandList<ProxyBase> &)' 함수를 호출하

  므로 함수가 암시적으로 삭제되었습니다.

          with

          [

              ProxyBase=wtr::MeshProxy

          ]

      C:\Users\Winteradio\Desktop\Project\Game-Engine\Engine\Private\Framework\CommandList.h(44,1):

      'wtr::CommandList<ProxyBase>::CommandList(const wtr::CommandList<ProxyBase> &)': 데이터 멤버이(가) 삭제되거나 액세스할 수 없는 'wtr::LinearArena::LinearArena(const wtr::LinearArena &)' 함수를 호출하므로 함수가 암시적으로 삭제되었습니다.

          with

          [

              ProxyBase=wtr::MeshProxy

          ]

      C:\Users\Winteradio\Desktop\Project\Game-Engine\external\Container\include\LinearArena.h(57,3):

      'wtr::LinearArena::LinearArena(const wtr::LinearArena &)': 함수가 명시적으로 삭제되었습니다.

1. Issue Overview

FrameView에서 SceneViewDynamicArray에 추가하려고 할 때,
컴파일러가 삭제된 복사 생성자를 참조하려고 시도하면서 C2280 에러가 발생

이 오류는 객체의 복사가 금지된 하위 멤버로부터 발생한 연쇄적인 암시적 삭제(Implicit Deletion)가 원인

2. Technical Root Cause

오류의 근본 원인은 렌더링 리소스를 관리하는 **LinearArena**의 설계에 있음

  • Deleted Copy Constructor: LinearArena는 이중 메모리 해제 방지 및 리소스 독점권 보장을 위해 복사 생성자가 delete 되어 있음
  • Propagation of Deletion: LinearArena를 멤버로 포함하는 CommandList, ProxyList, 그리고 최종적으로 SceneView까지 복사 생성자가 컴파일 타임에 자동으로 삭제되어있음
  • Container Constraint: DynamicArray<T>에 객체를 PushBack하거나 내부 재배치(Reallocation)가 일어날 때, 객체의 **복사(Copy)**가 발생해야 하지만 SceneView는 복사가 불가능한 상태였으므로 컴파일 에러가 발생

3. Resolution: Reference Counting (RefCounted) Strategy

단순히 std::move를 사용하는 것만으로는 메모리 정렬(Alignment) 및 무거운 Arena 객체의 이동 비용 문제를 완벽히 해결할 수 없다고 판단하여,
**객체의 주소 고정(Pinning)**과 **공유 소유권(Shared Ownership)**을 보장하는 RefCounted 방식으로 구조를 개선

Key Changes

  • Value to Reference Semantics: DynamicArray<SceneView> (Value 기반) 구조를 포인터 기반의 참조 관리 방식으로 변경
  • Safe Resource Management: SceneViewRefCounted 객체로 정의하여, 여러 시스템(Renderer, Scene, Frame)이 안전하게 해당 View를 참조할 수 있도록 수정

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions