2014-09-26 5 views
-3

I이 제대로 작동하지 않는 다음 코드 ...[] 기능은 C++에서 제대로 작동하지 않는 삭제

코드 :

#include <iostream> 
#include <new> 
#define nullptr NULL 
using namespace std; 

int main() 
{ 
    int i,n; 
    int * p; 
    cout << "How many numbers would you like to type? "; 
    cin >> i; 
    p= new (nothrow) int[i]; 
    if (p == nullptr) 
    cout << "Error: memory could not be allocated"; 
    else 
    { 
    for (n=0; n<i; n++) 
    { 
     cout << "Enter number: "; 
     cin >> p[n]; 
    } 
    cout << "You have entered: "; 
    for (n=0; n<i; n++) 
     cout << p[n] << ", "; 
    delete[] p; 
    for (n=0; n<i; n++) 
     cout <<"a "<< p[n] << endl; 
    } 
    return 0; 
} 

delete[] p; 문을 사용하면 내가 값을 인쇄 p 이전에 할당 된 메모리가 해제 되었기 때문에 모든 요소가 가비지 값을 생성해야하지만 첫 번째 2 개 요소에 대해서만 가비지 값을 생성하고 나머지 요소는 할당 된 값을 인쇄합니다. 즉 할당 된 총 메모리는 다음과 같습니다. 해제되지 않았습니다 ...

  • 왜 그런가?
  • 어떻게이 문제를 해결할 수 있습니까?
+1

정의되지 않은 동작은 ** 정의되지 않음 **입니다. 메모리를 해제했다고해서 그것이 쓰레기로 덮어 써야한다는 것을 의미하지는 않습니다. 사실, 당신은 자신이 소유하지 않은 메모리를 읽으려는 segfault를 얻지 못하기 때문에, 당신이 뭔가 다른 것을 요구할 경우를 대비하여 라이브러리는 메모리를 갖고있을 가능성이 높습니다. 더 중요한 것은'nullptr'을'NULL'로 정의하는 이유는 무엇입니까? – IllusiveBrian

+0

알렉스 200 달러에 대해 정의되지 않은 동작을 취할 것입니다. – user657267

+1

@KhairulBasar 개념은 범위를 벗어난 지역 변수와 유사합니다. 다음을 읽는 것이 도움이 될 수 있습니다. http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed - 외부 -의 - 범위 –

답변

1

메모리가 비어 있지 않은 것은 아닙니다. 주소 p에서 시작하는 메모리는 사용 가능하지만 이전에 기록 된 데이터의 일부가 여전히 남아있을 수 있습니다. 이 값을 다르게하려면 할당 된 메모리를 삭제하기 전에 값을 변경하십시오.

1

프로그램에 정의되지 않은 동작이 있습니다. 배열이 할당 된 메모리 범위의 메모리 페이지가 OS에서 삭제되거나 다른 데이터로 덮어 쓰이지 않았습니다.

수정할 사항이 없습니다. 이 메모리에 액세스 할 수 없습니다. 프로그램이 삭제 후 배열에 액세스하려고하면 프로그램에 버그가 있음을 의미합니다. 버그를 찾으려면 포인터를 NULL로 설정할 수 있습니다. 예 :

delete[] p; 
p = nullptr;