반도체/C++

7. 공부목적 C++ 기록 new 연산자

Clair_de_Lune 2024. 7. 17. 13:53
728x90

 

 

 

 

 

 

 

 

출처랑 참고는 인프런 강의 판다코딩님

 

 

 

 

 

 

new연산자

이 new 연산자가 어떠한 역할을 하느냐 먼저 첫 번째로 
어떤 데이터형을 원하는지 new 연산자에게 알려주면 두 번째로 new 연산자는
그 데이터형에 알맞은 크기의 메모리 블록을 찾아내서 세 번째로 그 블록의 주소를 리턴하게 됩니다



int* pointer  =  new int ;
int 별 포인터는 new int다

이 new int 부분은 인트형 데이터를 지정할 수 있는 새로운 메모리가 필요하다고 알려주게 되는 것
그러면은 이 new 연산자는 뒤따라오는 데이터형을 확인을 하고 몇 바이트가 필요한지
계산합니다 지금 같은 경우에는 윈도우 팬 기준으로 인트형은 4바이트니까 4바이트라고 계산이
되겠네요 이제 아바이트를 저장할 수 있는 메모리 블록을 찾아 그 주소를 이 포인터에게 리턴에서 초기화 해주게 되는 겁니다
저희가 이전 시간에는 따로 인트형 변수를 만들어서 그 주소를 가지고 포인터 변수를 초기화
하였는데 이렇게 new 연산자를 사용하게 되면 그러한 과정 없이 포인터 변수를 초기화 할 수 있습니다.




이러한 방식은 메모리 제어권을 저희 사용자에게 줄 수 있다는 점에서 큰 장점이 있습니다.
이렇게 필요할 때 new 를 사용해서 메모리를 대입하는 것은 C++의 아주 강력한 메모리 관리 기능의 절반에 불과합니다.

[2번째 기능 !!]

delete 연산자
사용한 메모리를 다시 메모리 폴로 환수
환수된 메모리는 프로그램의 다른 부분이 다시 사용




사용한 메모리를 다시 메모리 풀의 영역으로 환수하는 Delete 연산자입니다
이렇게 환수된 메모리는 프로그램의 이렇게 환수된 메모리는 프로그램의 다른 부분이 다시 사용할 수 있습니다



int* ps = new int ;
//메모리 사용
delete ps ;
지금 new를 사용해서 포인터 변수 ps를 선언을 했고 그리고 중간에 어떤 코드를 통해서
메모리를 사용한 다음에 delete ps로 이 ps에 할당된 메모리를 다시 프로그램의 다른
부분이 이 메모리를 사용할 수 있도록 프로그램에 반환해 줍니다
그래서 이 new를 사용한 다음에는 반드시 delete를 사용해야 합니다


그렇지 않는다면 대입은 되었지만 나중에 사용되지 않는 메모리 누수가 발생할 수 있고 메모리
누수의 규모가 너무 커지게 된다면 프로그램은 흔히들 말하는 먹통이 될 수 있습니다



[Delete 4가지  규칙]


1.먼저 첫 번째로 New로 대입하지 않은 메모리는 Delete로 해제할 수 없습니다
포인터 변수를 선언할 때 일반 변수의 주소를 사용하여 선언한 경우에는 딜리트로 해제할 수 없습니다.


2.같은 메모리 블록을 연달아 두 번 연속 딜리트로 해제할 수 없습니다.
즉, 한 번 선언된 포인터 변수는 딜리트를 한 번 하는 것으로 족합니다.

3 이 new 연산자 역시 대괄호를 사용하여서 배열을 사용할 수 있습니다.
이렇게 new 대괄호로 메모리를 대입할 경우 delete 역시 대괄호를 사용하여 해제해 주어야한다.

4.반대로 new 연산자를 사용할 때 대괄호를 사용하지 않았다면 delete 역시 대괄호를 사용하지 않아야한다.



#include <iostream>

using namespace std;

int main(){

    double* p3 = new double[3];     //double 형 데이터 3개를 저장 할 수 있는 공간 대입
    p3[0] = 0.2;                              //p3를 배열 이름 처럼 취급
    p3[1] = 0.5;
    p3[2] = 0.8;

    cout << "p3[1] is " << p3[1] << ".\n";

    p3 = p3 + 1;                            //포인터 증가

    cout << "Now p3[0] is " << p3[0] << " and ";
    cout << "p3[1] is " << p3[1] << "\n.";

    p3 = p3-1;                          //다시 시작 위치를 지시한다.
    delete[] p3;                       //배열 메모리를 해제한다.

// cin . get ()  ;


    return 0;
}




*메모리 만들고 해제시켜줘야함






















728x90

'반도체 > C++' 카테고리의 다른 글

9. 공부목적 C++ 07.10 포인터 연산 05  (0) 2024.07.17
8. 공부목적 07.10 C++ 반복문 for문 while 06  (0) 2024.07.17
6. C++ 입력받기  (0) 2024.07.17
5. 공부목적 C++ 포인터 (2)  (0) 2024.07.17
4. 공부목적 C++ 포인터 (1)  (0) 2024.07.09