반응형
깊은 복사 (Deep Copy)
객체 복사할 때,
원본 객체가 가지고 있는 데이터를 새로운 메모리 공간에 복사하여
완전히 독립적인 객체를 만드는 방식
💡 깊은 복사가 필요한 경우
✅ 클래스 내부에 포인터 멤버 변수가 존재할 때
✅ 동적 메모리를 개별적으로 관리해야 할 때
✅ 동일한 데이터를 공유하지 않고, 독립적인 복사본이 필요할 때
[C++] 얕은 복사 (Shallow Copy)
얕은 복사 (Shallow Copy)• 메모리 자체를 복사 하지 않고 주소만 복사• 일반적으로 「=」 연산자가 해당 [예제] 복사성생자 & 대입 연산자#include class Point{ int x = 0; int y = 0;public: Point() = default; Poi
zoosso.tistory.com
#include <iostream>
class vector
{
int* ptr;
std::size_t sz;
public:
vector(std::size_t sz, int value = 0) : sz(sz)
{
ptr = new int[sz];
for (std::size_t i; i < sz; i++)
{
ptr[i] = value;
}
}
~vector() { delete[] ptr; }
// 복사 생성자 직접 구현
vector(const vector& other)
: sz(other.sz)
{
ptr = new int[sz];
memcpy(ptr, other.ptr, sizeof(int) * sz);
}
};
int main()
{
vector v1(5);
vector v2 = v1; // 복사 생성자
}
[예제] 대입 연산자의 얕은 복사
#include <iostream>
class vector
{
int* ptr;
std::size_t sz;
public:
vector(std::size_t sz, int value = 0) : sz(sz)
{
ptr = new int[sz];
for (std::size_t i; i < sz; i++)
{
ptr[i] = value;
}
}
~vector() { delete[] ptr; }
};
int main()
{
vector v1(4, 1);
vector v2(3, 2);
v2 = v1; // 대입 연산자
}
복사 생성자와 마찬가지로 얕은 복사 문제가 있는 상태로
• v2 가 v1 와 같은 버퍼를 가리키면서 동시 변경
• 어느 한쪽의 버퍼를 삭제하면 다른 한쪽도 삭제
추가로, v2가 처음 만들어지면서 가리키고 있던
버퍼 메모리 누수가 발생할 수 있다.
#include <iostream>
class vector
{
int* ptr;
std::size_t sz;
public:
vector(std::size_t sz, int value = 0) : sz(sz)
{
ptr = new int[sz];
for (std::size_t i; i < sz; i++)
{
ptr[i] = value;
}
}
~vector() { delete[] ptr; }
vector & operator=(const vector& other)
{
// 자신 과의 대입 조사
if (&other == this)
return *this;
if (sz != other.sz) // 같은 크기가 아닌 경우에만
{
sz = other.sz;
delete[] ptr; // 먼저, 본인이 들고 있던 메모리 해제
ptr = new int[sz];
}
memcpy(ptr, other.ptr, sizeof(int) * sz);
return *this;
}
};
int main()
{
vector v1(4, 1);
vector v2(3, 2);
v2 = v1; // 대입 연산자
}

반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C++] RAII & stack unwinding (1) | 2025.03.19 |
---|---|
[C++] 오류 처리 방식 (Error Handling) (3) | 2025.03.17 |
[C++] 함수 객체 (function object) (2) | 2025.03.15 |
[C++] 상속과 복사/대입 연산자 (0) | 2025.03.14 |
[C++] 얕은 복사 (Shallow Copy) (2) | 2025.03.13 |
댓글