>source

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 를 사용하면 어떻게 되나요? ?

c++

  • 답변 # 1

    new [] 를 사용할 때  일부 c++  구현은 포인터가 반환되기 전에 주소에서 배열의 할당 크기를 추적합니다. 이것은 표준에 의해 정의되지 않은 구현 세부 사항입니다.

    다음 답변은이 가능한 구현에 대해 좀 더 자세히 설명합니다. new []와 delete를 쌍으로 묶는 방법으로 메모리 누수 만 발생할 수있는 방법은 무엇입니까?

    당신은 항상 new 와 일치해야합니다   delete 와 함께  그리고 new []   delete [] 와 함께 . 이들을 혼합하는 것은 정의되지 않은 동작입니다.

  • 답변 # 2

    포인터 자체는 완전히 구분할 수 없습니다. 그것이당신new 와 일치하는 것을 기억해야하는 이유입니다 / delete  그리고 new[] / delete[] .

    일치하지 않으면 정의되지 않은 동작이 트리거됩니다.

  • 답변 # 3

    C ++에서 아래 코드에서 포인터 p와 q 사이에 차이가 있습니까?
    포인터 사이에보이는차이는 없지만 확실히 하나의 차이가 있으며 중요합니다. 하나는 정수에 대한 포인터이고 다른 하나는 주어진 크기의 배열에서 첫 번째 요소 인 정수에 대한 포인터입니다.

    안타깝게도 포인터 만 제공하면 말할 방법이 없습니다.

    q 삭제를 사용한 경우 어떻게됩니까?
    아마 아무것도 없지만 아마도 많은 것입니다.

    우선, delete 를 호출   delete[] 대신  모든 요소가 아닌 배열의 첫 번째 요소에서 소멸자를 정확히 한 번만 호출합니다. 이제 int 와 같은 사소한 유형의 소멸자  아무것도하지 않습니다. 그렇게하는 한 실질적인 차이는 없습니다. 그러나 소멸자 (또는 소멸자 체인)가 실제로 무언가를 수행하는 사소하지 않은 유형에는 큰 차이가 있습니다.

    둘째, 기본 원시 메모리 블록의 적절한 할당 해제를 방해하고 있습니다. 이것은 때때로 충돌을 일으킬 수 있습니다. 이전에 손상으로 인해 관련되지 않은 무고한 코드 조각으로 인해 나중에 충돌이 발생할 수도 있습니다. 시도하고 디버그하십시오.

    또는 자동 메모리 누수가 발생할 수 있습니다. 구현에 따라, 때로는 특정 경우 (예 : 페이지 경계에 부딪치지 않는 경우) "행운"에 달려 있습니다.
    배열을 할당 및 해제하고 단일 요소를 할당 및 해제하는 것은 똑같지 않기 때문입니다. 그것들은 (보통) 약간 다르게 구현되며,구현은 일치하지 않는 new 에 대처할 수 있습니다 / delete 보장되지 않습니다. 디버거에서는 일반적인 실행과 비교하여 다른 동작을 수행 할 수 있습니다.

    잘못된 형태의 delete 호출  정의되지 않은 동작을 호출하는 것을 의미합니다. 기본적으로 모든 일이 발생할 수 있음을 의미합니다. 여기에는 "아무것도"뿐만 아니라 "디버거 불가능한 문제"도 포함됩니다. 또한 컴파일러가 악의적으로 최적화하거나 전체 주변 기능을 제거하거나 특정 조건이 항상 참이라고 가정 할 수 있습니다.매우무슨 일이 일어나고 있는지 알아 내려고하는 데 며칠과 며칠을 보내는 끔찍한 놀라움으로 이어질 수 있습니다

관련 자료

  • 이전 Serenity-Cucumber, 여러 기능 파일에서 동일한 시나리오 단계를 사용하는 방법
  • 다음 javascript - threejs에서 datGUI를 사용하여 하나의 슬라이더로 둘 이상의 매개 변수 사용