COPY
C++ Copy and Swap idiom
C++에선 클래스가 리소스를 관리하고 클래스의 생성/소멸에 맞춰 리소스를 할당/해제한다. 관련된 멤버 함수와 그 역할은 아래와 같다. 생성자: 리소스를 할당한다. 복사 생성자: 리소스를 복사해온다. 복사 대입 연산자: 기존 리소스를 해제하고 리소스를 복사해온다. (C++11부터) 이동 생성자: 리소스를 가져온다. (C++11부터) 이동 대입 연산자: 기존 리소스를 해제하고 리소스를 가져온다. 소멸자: 리소스를 해제한다. Copy-and-swap idiom은 간결하면서도 강력한 예외 안정성(strong exception safety)을 보장해주는 복사 대입 연산자를 짤 수 있게 해준다. 또한 이동 대입 연산자에를 짤 때에도 유용하다. 문자열 리소스를 관리하는 간단한 클래스를 생각해보자. class Foo ..
C++ 얕은 복사 깊은 복사 (Shallow/Deep Copy)
아래와 같이 코드를 작성하면 a1 객체와 a2 객체가 서로 같은 int형에 대한 포인터 변수를 공유하기 때문에 이미 해제된걸 재해제 하기 때문이다. #include using namespace std; class A { int* ptr = nullptr; public: A() { ptr = new int(); } A(const A& Ref) { this->ptr = Ref.ptr; } ~A() { delete ptr; } }; int main() { // 기본 생성자 호출 A a1; // 복사 생성자 호출 A a2(a1); } 이를 해결하기 위해선 ptr를 참조 대상값 가지고서 재 할당 해줘야한다. #include using namespace std; class A { int* ptr = nullptr;..
C# 배열 복사 방법
한 가지 유의해야할 점은 Clone 함수는 얕은 복사이다. using System; using System.Collections.Generic; using System.Runtime.InteropServices; public class A { public float value { get; set; } public A(float value) { this.value = value; } } public class Test { static readonly int mk_size = 10; static void Print(A[] arr) { foreach (var item in arr) { Console.Write($"{item.value} "); } Console.WriteLine(); } static void ..