서울 원주민 본의 공부방

C++ 동적할당

2020. 10. 8. 00:36

#include <iostream>

using namespace std;

char* Func()
{
char szBuff[16] = "";
cin >> szBuff;

return szBuff;
}

char* Func2();
void main()
{
// 동적 할당
// 사용자가 필요할 때 메모리에 등록하고, 사용자가 필요할 때 메모리에서 해제하는 것.

//// 동적할당의 필요성
//// Func()에서 선언한 szBuff는 지역변수이다.
//// 지역 변수에 값을 입력하여도 함수가 종료되면 메모리가 해제되면서 입력한 값들이 소멸한다.
//// 소멸한 공간의 주소를 가지고 있어도 정상적인 값을 확인할 수 없다!!
//char* pBuff = Func();
//cout << pBuff << endl;


// 동적할당_##1. malloc()
// void* : Heap영역에 할당한 메모리의 시작 주소를 반환한다.
// -> 단, 시작 주소만 반환할 뿐 얼마만큼을 어떤형식으로 읽을지 알 수 없는 상황이다.
// -> 정상적으로 사용하기 위해서는 형 변환이 필요하다.

// size_t _Size : Heap 영역에 얼마만큼 할당할 것인지 전달(byte단위)

//// Heap 영역에 4bytes만큼 공간을 할당한다.
//// 이후 해당 공간의 시작 주소를 반환한다.
//// 단, 시작 주소의 정보만 알 뿐 몇 바이트를 사용할지, 어떤 형식으로 읽을지 모르는 상황이다.
//malloc(4);

//// Heap 영역에 4bytes만큼 공간을 할당하고,
//// 해당 공간의 시작 주소를 반환하는데, int*형으로 형 변환을 시켰다!
//(int*)malloc(4);


//// 메모리 공간을 할당하라고 명령했다!
//// 단, 해제하라고 명령한 적은 없다!!
//// -> 메모리 누수가 남았다!
//int* ptr = (int*)malloc(sizeof(int));

//cout << "ptr: " << ptr << endl;
//cout << "*ptr: " << *ptr << endl;


//// 메모리 공간 해제
//// free()
//free(ptr);
//ptr = nullptr;

//// free함수를 호출하여 메모리 공간을 해제하였으나,
//// ptr은 주소를 그대로 가지고 있다!!
//// 이 때, ptr이 가지고 있는 주소를 Dangling Pointer라고 한다.
//cout << "ptr: " << ptr << endl;


//// Dangling Pointer가 위험한 이유
//// ##1. 할당되지 않은 메모리 접근의 시도가 있을 경우 프로그램 강제로 종료된다.
//// ##2. 다른 곳에서 할당을 받았는데 우연히 주소가 겹치는 경우


//// Dangling Pointer 방지 방법
//// free() 호출 후 변수에 nullptr로 다시 초기화를 진행하자!



// 동적할당_##2. calloc()
// size_t _Count : 몇 개를 할당할 것인지 전달
// -> 배열을 만들겠다!
// 프로그램 가동 중 배열의 크기를 설정할 수 있다!
// -> 동적 배열

//// Heap 영역에 int형 크기만큼(4bytes), 5개의 공간을 만들어라!
//// -> 총 20bytes의 공간을 할당하여라!
//(int*)calloc(5, sizeof(int));


//int iSize = 0;
//cin >> iSize;

//int* ptr = (int*)calloc(iSize, sizeof(int));

//for (int i = 0; i < iSize; ++i)
// //cout << *(ptr + i) << endl;
// cout << ptr[i] << endl;


// malloc과 calloc의 차이점
// ##1. 초기화의 차이점
// malloc : 쓰레기 값 초기화
// calloc : 0 초기화


//// malloc으로 동적 배열 만들기
//int iSize = 0;
//cin >> iSize;

////int* ptr = (int*)calloc(iSize, sizeof(int));
//int* ptr = (int*)malloc(iSize * sizeof(int));

//free(ptr);
//ptr = nullptr;


// 동적할당을 이용한 문제 해결
char* pBuff = Func2();
cout << pBuff << endl;

free(pBuff);
pBuff = nullptr;
}

char* Func2()
{
char* pBuff = (char*)calloc(16, sizeof(char));
cin >> pBuff;

//char szBuff[16] = "";
//cin >> szBuff;

return pBuff;
}

 

#include <iostream>

using namespace std;

char* Func();
void main()
{
// C++ 동적 할당
// malloc과 calloc은 C기반의 동적할당이다!
// -> 더이상 사용하지 않는다.

// new 연산자
// new 연산자 뒤에 명시한 자료형을 토대로
// Heap 영역에 자료형의 크기만큼 공간을 할당한다!
// 이후, 자료형의 포인터형으로 주소를 형 변환하여 반환해준다!!
/*
new 자료형
*/

//(int*)malloc(sizeof(int));
//new int;


//int* ptr = new int;
//cout << "ptr: " << ptr << endl; // Heap 영역의 주소
//cout << "*ptr: " << *ptr << endl; // 해당 주소의 값(쓰레기 값)


//// delete
//// delete를 수행한다해도 Dangling pointer로 인해 위험한 상황이 연출된다.
//// delete이후 nullptr로 초기화하는 습관을들이자!!
//delete ptr;
//ptr = nullptr;

//cout << "ptr: " << ptr << endl; // Dangling Pointer!!!



//// new를 이용한 동적 배열 만들기
//int iSize = 0;
//cin >> iSize;

//int* ptr = new int[iSize];

//for (int i = 0; i < iSize; ++i)
// cout << ptr[i] << endl;

//delete[] ptr;
//ptr = nullptr;


//// C기반의 동적할당과 C++기반의 동적할당의 차이점
//// C++기반의 동적할당은 할당과 동시에 초기화가 가능하다!!!
//// -> C++기반의 초기화를 이용하면 된다.
//int iA = 10; // C기반의 초기화 =
//int iB(20); // C++기반의 초기화 ()

//cout << iA << ", " << iB << endl;


//int* ptr = new int(10);

//cout << *ptr << endl;

//delete ptr;
//ptr = nullptr;


char* pBuff = Func();
cout << pBuff << endl;

delete[] pBuff;
pBuff = nullptr;
}

char* Func()
{
char* pBuff = new char[16];
cin >> pBuff;

return pBuff;
}

'개발 공부 > C++' 카테고리의 다른 글

C++ 입출력 스트림버퍼  (0) 2020.10.08
C++ Text RPG  (0) 2020.10.08
C++ 성적표 예제  (0) 2020.10.08
C++ 문자열 뒤집기 예제  (0) 2020.10.08
C++ 문자열 상수, 문자열 함수, 구조체  (0) 2020.10.08

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band