C ++에서 아래 코드에서 포인터 p와 q 사이에 차이점이 있습니까?
int* p = new int;
int* q = new int[5];
하나의 int에 새로운 메모리를 할당하고 두 번째는 5 int의 배열에 메모리를 할당하지만, 기본적으로 하나의 int를 가리키는 포인터와 int의 배열을 가리키는 포인터 사이에 차이점이 있습니까?
delete[] q
를 사용해야한다는 것을 읽었 기 때문에이 의심이 생겼습니다.
q가 가리키는 메모리를 확보하지만
delete p
p가 가리키는 단일 int의 경우
delete q
를 사용하면 어떻게 되나요?
?
-
답변 # 1
-
답변 # 2
포인터 자체는 완전히 구분할 수 없습니다. 그것이당신이
new
와 일치하는 것을 기억해야하는 이유입니다 /delete
그리고new[]
/delete[]
.일치하지 않으면 정의되지 않은 동작이 트리거됩니다.
-
답변 # 3
C ++에서 아래 코드에서 포인터 p와 q 사이에 차이가 있습니까?
포인터 사이에보이는차이는 없지만 확실히 하나의 차이가 있으며 중요합니다. 하나는 정수에 대한 포인터이고 다른 하나는 주어진 크기의 배열에서 첫 번째 요소 인 정수에 대한 포인터입니다.안타깝게도 포인터 만 제공하면 말할 방법이 없습니다.
q 삭제를 사용한 경우 어떻게됩니까?
우선,
아마 아무것도 없지만 아마도 많은 것입니다.delete
를 호출delete[]
대신 모든 요소가 아닌 배열의 첫 번째 요소에서 소멸자를 정확히 한 번만 호출합니다. 이제int
와 같은 사소한 유형의 소멸자 아무것도하지 않습니다. 그렇게하는 한 실질적인 차이는 없습니다. 그러나 소멸자 (또는 소멸자 체인)가 실제로 무언가를 수행하는 사소하지 않은 유형에는 큰 차이가 있습니다. 둘째, 기본 원시 메모리 블록의 적절한 할당 해제를 방해하고 있습니다. 이것은 때때로 충돌을 일으킬 수 있습니다. 이전에 손상으로 인해 관련되지 않은 무고한 코드 조각으로 인해 나중에 충돌이 발생할 수도 있습니다. 시도하고 디버그하십시오.또는 자동 메모리 누수가 발생할 수 있습니다. 구현에 따라, 때로는 특정 경우 (예 : 페이지 경계에 부딪치지 않는 경우) "행운"에 달려 있습니다.
배열을 할당 및 해제하고 단일 요소를 할당 및 해제하는 것은 똑같지 않기 때문입니다. 그것들은 (보통) 약간 다르게 구현되며,구현은 일치하지 않는new
에 대처할 수 있습니다 /delete
보장되지 않습니다. 디버거에서는 일반적인 실행과 비교하여 다른 동작을 수행 할 수 있습니다.잘못된 형태의
delete
호출 정의되지 않은 동작을 호출하는 것을 의미합니다. 기본적으로 모든 일이 발생할 수 있음을 의미합니다. 여기에는 "아무것도"뿐만 아니라 "디버거 불가능한 문제"도 포함됩니다. 또한 컴파일러가 악의적으로 최적화하거나 전체 주변 기능을 제거하거나 특정 조건이 항상 참이라고 가정 할 수 있습니다.매우무슨 일이 일어나고 있는지 알아 내려고하는 데 며칠과 며칠을 보내는 끔찍한 놀라움으로 이어질 수 있습니다
관련 자료
- c의 함수에서 배열을 반환 할 때 정적 배열 선언과 포인터 배열 선언의 차이점은 무엇입니까?
- java - sendRedirect (testjtp)와 sendRedirect (/testjsp)의 차이점
- PHP 배열에서 동일한 날짜를 갖는 요소를 추가하여 새 배열을 형성하는 방법
- android - 최근 앱 실행과 홈 화면의 차이점
- python - 클래스 인스턴스와 클래스 정의에서 클래스 데코레이터를 호출하는 것의 차이점은 무엇입니까?
- javascript - 문서와 컬렉션 참조의 차이점
- c - "실제"배열 포인터 및 malloc
- rpmsign --addsign과 rpm --addsign의 차이점은 무엇입니까?
- C ++에서 포인터를 배열 형식으로 변환하는 데 문제가 있습니까?
- bash 배열의 요소를 곱하고 배열 요소를 새 값으로 설정
- activemq artemis - brokerxml 파일에 작성되고 JMX를 통해 생성 된 큐의 차이점
- javascript - 배열의 모든 요소를 계산하고 모든 항목에 대해 키/값 개체를 만드는 방법은 무엇입니까?
- javascript - 로컬 스토리지 배열에서 특정 요소 삭제
- c++ - #pragma omp parallel과 #pragma omp parallel의 차이점
- 이 쿼리의 차이점은 무엇입니까 MySQL 날짜 범위
- Bash Linux에서 이틀 간의 차이를 숫자로 가져옵니다
- javascript - 특정 요소 배열의 요소 합계 얻기
- linux - SIGCHLD에 대한 기본 처리와 처리를 SIG_IGN으로 명시 적으로 설정하는 것의 차이점은 무엇입니까?
- amazon web services - 일반 AWS EC2 인스턴스와 ML AWS EC2 인스턴스의 차이점은 무엇입니까?
- lisp - `# '(lambda…`와`(lambda…`사이에 차이점이 있습니까?
new []
를 사용할 때 일부c++
구현은 포인터가 반환되기 전에 주소에서 배열의 할당 크기를 추적합니다. 이것은 표준에 의해 정의되지 않은 구현 세부 사항입니다.다음 답변은이 가능한 구현에 대해 좀 더 자세히 설명합니다. new []와 delete를 쌍으로 묶는 방법으로 메모리 누수 만 발생할 수있는 방법은 무엇입니까?
당신은 항상
new
와 일치해야합니다delete
와 함께 그리고new []
delete []
와 함께 . 이들을 혼합하는 것은 정의되지 않은 동작입니다.