2017-04-16 8 views
2

재미있는 작은 프로그램을 실행 중이었고 당혹 스러웠던 문제가 발생했습니다.C++ new 연산자가 새 메모리를 할당합니다.

#include <iostream> 
#include <string> 

using namespace std; 

struct T 
{ 
    int val; 
}; 
int main() 
{ 
    for(int i = 0; i < 2; ++i) 
    { 
     T *p = new T; 
     cout << p << endl; 
     delete p; 
    } 

    T *q = new T; 
    cout << q << endl; 
    delete q; 

    return 0; 
} 

출력 :

0x16b76d0 
0x16b76d0 
0x16b76d0 

그들은 동일한 메모리 위치에 모든입니까?

+2

네, 모두 같은 위치입니다 *. 모든 프로그램이 수행하는 모든 작업은 동일한 객체에 대해 동일한 메모리를 재사용하는 것입니다 (왜 각 delete 후에는 더 이상 사용되지 않고 메모리 관리자가 적절하다고 간주하는 경우 다른 할당에 사용할 수 있으며이 경우에는 그렇지 않습니다) . – WhozCraig

답변

4

주소를 인쇄 한 후 메모리가 삭제됩니다. 그런 다음 메모리 관리자는 새로운 주소를 할당하기 위해 동일한 주소를 자유롭게 선택할 수 있습니다.

1

당신의 OS (운영 체제)와 함께 컴파일러하여 동적으로 할당 된 메모리에 할당되는 메모리 주소를 결정합니다. delete가 호출되면 포인터가 가리키고있는 메모리 주소는 더 이상 참조되지 않습니다. 따라서 컴파일러는 새 할당에 대해 메모리 주소을 자유롭게 사용할 수 있습니다. 우리가이 프로그래밍 레벨에서 통제 할 수있는 것이 아닙니다.

+0

컴파일러가별로 없습니다. 컴파일러의 작업은 프로그램이 실행되고 동적 저장소를 요청할 때까지 오래되었습니다. – user4581301