C++ study(10)

김혜원·2023년 1월 31일
0

c++study

목록 보기
10/11

다차원 배열 동적 할당

C에서와 같이, int형 2차원 배열이라면 int*형 1차원 배열로 취급한 뒤 각 칸의 값이 int형 배열의 시작 주소인 포인터 배열로 보기로 했다.

example code
#include <iostream>
using namespace std;

int main()
{

	int **arr;
	int m, n;
	cout << "number of column:";
	cin >> m;
	cout << "number of row:";
	cin >> n;

	arr = new int *[m];
	for (int i = 0; i < m; i++)
	{
		arr[i] = new int[n];
		for (int j = 0; j < n; j++)
			arr[i][j] = i * n + j + 1;
	}

	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
			cout << arr[i][j] << " ";
		cout << endl;
	}

	for (int i = 0; i < m; i++)
		delete[] arr[i];

	delete[] arr;
	arr = '\0';

	return 0;
}

행(m),열(n) 수를 입력받아 그 크기의 2차원 배열을 만들고, 제일 왼쪽 위 칸부터 1~m*n까지 자연수를 하나씩 넣었다.

  • 동적 메모리 할당
    바깥쪽 배열을 int형 배열로 생각하므로, 행 수 m개인 자료형이 _'int ' 인 크기 'm'인 배열을 동적할당한다.
    안쪽에서는 자료형
    'int'인 크기 'n'_인 배열을 동적 할당한다.
  • 동적 메모리 해제
    2중 포인터 arr을 한번만 delete하면 안된다.
    자신이 가리키던 int* 형 배열 값만 직접 날리므로, 그 값들이 가리키던 안쪽 배열 값들은 해제되지 않아 memory leaking 발생한다. 따라서 안쪽 int형 배열 먼저 delete 후, 마지막으로 arr을 delete한다.

깊은 복사 vs. 얕은 복사 ?

shallow copy얕은 복사는 포인터가 아닌 단순한 멤버 변수의 값만 제대로 복사하는 것.
deep copy깊은 복사는 포인터, 그리고 동적 메모리를 가리키는 포인터와 그 메모리의 내용도 모두 제대로 복사하며, 복사 과정에서 각 class가 다른 메모리를 가리키게 한다.

" The Big Three " 개념..
C++에서 대입연산자, 복사 생성자, 소멸자 를 묶어 말하는 용어로, 이들은 정의하지 않으면 자동으로 기본 정의 되지만, 멤버 중 포인터 등이 존재하면 우리가 직접 맞는 내용으로 정의할 필요가 있다.

동적 배열을 위한 깊은 복사

class가 멤버 변수로 동적 배열을 가진 경우,
생성자에 크기를 넣어 배열의 크기를 정해 줘야 한다.


class MyClass{
private:
	int nSize;
	int *arr;
public:
	MyClass();
	MyClass(int*, int);
	MyClass(MyClass&);
	~MyClass();
    int getSize();
    int getNum(int);
    void print();
    MyClass& operator =(const MyClass&);
    };

0개의 댓글