new 키워드 및 C++의 연산자 오류에 대한 일치 없음

Muhammad Husnain 2023년10월12일
  1. C++의 new 키워드
  2. C++에서 new 키워드의 일반적인 오류
new 키워드 및 C++의 연산자 오류에 대한 일치 없음

이 기사에서는 C++에서 new 키워드를 사용하는 방법에 대해 설명합니다. 초보 프로그래머는 일반적으로 new 키워드를 사용하는 동안 많은 실수를 합니다.

우리는 또한 그들이 범하는 가장 일반적인 오류와 잠재적인 수정 사항에 대해 논의할 것입니다.

C++의 new 키워드

new 키워드는 운영 체제에 힙 메모리에 일부 공간을 할당하도록 요청하는 연산자로 사용됩니다. 필요한 양의 메모리를 힙에서 사용할 수 있는 경우 해당 메모리가 할당되고 해당 메모리의 주소가 할당되고 초기화된 메모리가 포인터 변수에 반환됩니다.

new 키워드를 사용하는 구문은 다음과 같습니다.

datatype pointer_variable_name = new datatype;

이 데이터 유형은 암시적 데이터 유형 또는 클래스 이름일 수도 있습니다. new 키워드로 클래스의 포인터 변수를 만들면 클래스 생성자가 호출되고 메모리가 힙에 할당됩니다.

new 키워드를 사용하지 않고 변수가 스택에서 초기화되면 해당 변수는 범위를 벗어날 때 자동으로 소멸됩니다. 그러나 이것은 힙 변수의 경우가 아닙니다.

힙 변수는 자동으로 소멸되지 않습니다. 오히려 delete 연산자를 사용하여 수동으로 제거해야 합니다. 그렇지 않으면 메모리에 매달려 메모리 누수 문제가 발생합니다.

아래의 예를 살펴보겠습니다.

#include <iostream>
using namespace std;

int main() {
  int *intPtr = new int;
  *intPtr = 10;
  cout << "Value of Integer pointer is: " << *intPtr << endl;
  delete intPtr;
  return 0;
}

출력:

Value of Integer pointer is: 10

C++에서 new 키워드의 일반적인 오류

특정 상황에서 프로그래머는 올바른 데이터로 초기화하지 않고 할당되지 않은 데이터를 사용하여 프로그램 실행을 방해할 수 있는 알 수 없거나 원치 않는 데이터가 생성됩니다. 예를 들어 2가지 상황이 있습니다.

int *ptr = new int;      // situation 1
int *ptr2 = new int[5];  // situation 2

첫 번째 상황에서는 단일 변수에 메모리가 할당되고 두 번째 상황에서는 5 정수 변수에 메모리가 할당됩니다. 즉, 힙에 5개의 인덱스 배열이 생성됩니다.

첫 번째 상황을 사용하여 포인터를 선언하여 ptr[3]에 액세스한다고 가정합니다. 이 경우 메모리 위치에 이전에 무엇이 배치되었는지 모르기 때문에 일부 알 수 없는 오류가 발생할 수 있는 할당되지 않은 공간에 액세스하고 있습니다.

따라서 힙에 할당된 메모리를 할당하고 사용할 때 매우 주의해야 합니다.

클래스에 대한 포인터가 있고 클래스 개체의 배열을 만들어야 하는 상황을 고려하십시오.

class Students {
  int roll_num;
  string name;
};
int main() {
  Students *student_list = new Students[10];
  for (int k = 0; k < 10; k++) {
    student_list[k] = new Students();  // line 10
  }
}

위 코드 스니펫의 10번째 줄에서 배열의 각 인덱스에서 객체를 초기화하고 있습니다. 그러나 이 줄은 다음과 같은 오류를 생성합니다.

/tmp/qqnmmMnApj.cpp: In function 'int main()':
/tmp/qqnmmMnApj.cpp:14:40: error: no match for 'operator=' (operand types are 'Students' and 'Students*')
   14 |         student_list[k] = new Students();
      |                                        ^

이는 student_list 배열의 모든 인덱스가 Students 클래스의 포인터가 아니라 Students 클래스의 객체이기 때문입니다. 따라서 초기화를 위해 new 키워드가 필요하지 않습니다.

다음과 같이 초기화해야 합니다.

student_list[k] = Students();

또 다른 일반적인 오류는 이미 삭제되거나 해제된 메모리 위치에 액세스하는 것입니다. 일부 함수가 delete 연산자를 사용하여 힙에서 할당된 메모리를 할당 해제하고 프로그램의 다른 지점에서 해당 위치에 액세스하려고 시도하는 특정 상황이 있습니다.

이로 인해 오류가 발생할 수 있으며 특히 더 큰 프로젝트에서 작업할 때 추적하기가 매우 어렵습니다. 아래의 예를 고려하십시오.

int main() {
  int *p = new int;
  *p = 5;
  cout << "before deletion: " << *p << endl;
  delete p;
  cout << "After deletion: " << *p << endl;
}

출력:

before deletion: 5
After deletion: 0

삭제 후 값이 메모리에서 지워지는 것을 출력에서 ​​볼 수 있습니다. 따라서 0을 반환합니다. 더 큰 프로젝트에서는 해제된 메모리 위치가 다른 프로그램에 의해 획득되고 프로그램 논리를 방해할 수 있는 다른 데이터가 포함되어 있을 수 있기 때문에 런타임에 원치 않는 오류가 발생할 수 있습니다.

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

관련 문장 - C++ Error