2016-07-21 2 views
1

C++에서 삭제 연산자를 이해하려고합니다.C++의 새 연산자 및 삭제 연산자의 논리를 이해하십시오.

나는 포인터와 new 연산자를 사용하여 뒤에 논리를 이해할 수있는, 그러나 나는 "delete 연산자 동적 변수를 제거하고 동적 변수는 자르기 쉬운 암석으로 점령. 메모리를 반환"p517을, 문제는 C로 해결하는 것을 이해 ++ 9 판.

나는 제 3의 cout 문과 일치하지 않는다고 생각합니다. 그리고 나는 세 번째의 계산서가 첫 번째와 비슷한 sth가 될 것으로 예상했다.

int main() { 
    int *p1; 
    cout << "p1 address: " << &p1 << " and points to the address "<< p1 << " which has the value: " << *p1<< endl; 

    p1 = new int; 
    cout << "p1 address: " << &p1 << " and points to the address "<< p1 << " which has the value: " << *p1<< endl; 

    delete p1; 
    cout << "p1 address: " << &p1 << " and points to the address "<< p1 << " which has the value: " << *p1<< endl; 

    cout << endl; 
    return 0; 
} 

내가 :) 어떤 설명을 부탁드립니다)

+0

포인터의 값은 변경되지 않습니다. 너는 무엇을 기대 했는가? 삭제 후 포인터를 사용하는 btw는 – Incomputable

+3

을 호출합니다. 모든 출력은 UB입니다. 첫 번째 인쇄 후 초기화되지 않은 포인터를 역 참조하고, 두 번째는 초기화되지 않은 변수를 읽고, 세 번째 역 참조는 삭제 된 포인터입니다. – BeyelerStudios

+0

내가 가리키는 메모리 주소가 다른 값을 가질 것으로 예상했다. 마치 포인터가 초기화되지 않은 것처럼! – Zingo

답변

1

delete 는에 메모리를 포인터 포인트를 변경하지 않습니다. 실제로 구현은 구현됩니다.

delete은 주어진 주소에있는 모든 개체를 해체하고 연결된 메모리를 할당 풀로 반환합니다. 일부 디버거는 해제 될 때 변수의 값을 덮어 쓸 수 있지만 사소한 유형의 경우 특별한 분해가 필요하지 않습니다. 즉 메모리는 그대로 풀에 반환 될 수 있습니다. 포인터는 변경되지 않습니다. delete p 이후에 우리는 p번 잡기 포인터으로 호출하여 해제 된 메모리의 주소를 보유합니다. 해당 포인터를 통한 모든 액세스는 정의되지 않은 동작입니다.

원시 포인터 및 특히 매달려있는 포인터를 처리하는 것은 오류가 발생하기 쉽기 때문에 C++ smartpointers을 알고있는 것이 좋습니다. unique_ptr :

std::unique_ptr<int> p;  // initialised to nullptr 
p = std::make_unique<int>(13); // new int with value 13 
p = std::make_unique<int>(37); // deleted previous int, assigned new int with value 37 
// optional (when p goes out of scope its pointee is deleted automatically) 
p.reset();      // deleted the int and reset p to nullptr 
관련 문제