2014-03-06 2 views
0

제발 내가 잘못 가고있다, 제발 아래에 내 코드를 삭제하거나 x를 해방하기 전에 잘 작동하지만 x를 삭제 한 후 코어 덤프 보여줍니다. 나는 이유를 모른다. 내가 한 것은 힙에 2 개의 변수를 새로운 키워드로 할당했지만 p = x는 p가 이제 x의 주소를 보유한다는 것을 의미합니다. 그때 나는 p를 풀고 마침내 나는 x를 풀어 버린다. 내가 잘못 가고있는 곳에서 도와주세요.포인터 동적 할당 (핵심 덤프)

#include <iostream> 
using namespace std; 


int main(){ 

int a; 
int *b=&a; 
cout<<b<<endl;//address of a 

int *x=new int; 
cout<<x<<endl; 
cout<<*x<<endl; 

int *p=new int; 

*x=10; 
*p=12; 

p=x; 

cout<<p<<endl; 
cout<<x<<endl; 
cout<<*p<<endl; 
cout<<*x<<endl; 

*x=13; 
cout<<*p<<endl; 

delete p; 

*x=14; 
cout<<*x<<endl; 
cout<<*p<<endl; 


delete x; 



return 0; 
} 

답변

0

수행합니다.

p=x; 

양 포인터 P 및 X 후 동일한 메모리 영역에 지점으로 시작한다. 그럼 당신은 처음 페이지를

delete p; 

를 삭제하고 그 후 당신은 X

delete x; 

삭제하고 메모리는 페이지를 삭제하는 경우 X는 이미 해제 된 가리키는.

그리고 당신은 스마트 포인터를 사용할 수있는이 문제를 방지하려면

*x=14; 
cout<<*x<<endl; 
cout<<*p<<endl; 


delete x; 

행동을 정의되지 않은 한 다음 모든 코드 페이지를 삭제 한 후 std::shared_ptr 예를 들어

는 출력은

#include <iostream> 
#include <memory> 


int main() 
{ 
    std::shared_ptr<int> x(new int); 
    std::shared_ptr<int> p(new int); 

    *x = 10; 
    *p = 12; 

    p = x; 

    std::cout << p << std::endl; 
    std::cout << x << std::endl; 
    std::cout << *p << std::endl; 
    std::cout << *x << std::endl; 

    *x = 13; 
    std::cout << *p << std::endl; 

    *x = 14; 
    std::cout << *x << std::endl; 
    std::cout << *p << std::endl; 


    return 0; 
} 

입니다

0x95e6008 
0x95e6008 
10 
10 
13 
14 
14 
+0

그래서 p, * x = 14 및 cout << * x를 삭제 한 후에 문제가 없습니까? 그것은 삭제됩니다 P는 ....? – user3215228

+0

@ user3215228 정의되지 않은 동작은 정의되지 않았습니다. 아무거나 일어날 수있다. –

+0

@ user3215228 내 업데이트 된 게시물보기. –

3

p=x;, p 및 X는 동일한 위치를 가리키는되면 (하나 x 원래에 지적). 둘 중 하나에서 delete을 호출하면 다른 하나가 매달려 렌더링되고 delete을 호출하면 두 번 비어 있고 정의되지 않은 동작이 발생합니다. p=x은 이전에 p에 할당 된 메모리에 더 이상 도달 할 수 없으므로 메모리 누수가 발생합니다.

은, 값이 아닌 포인터를 할당하는 문제가 두 번 같은 포인터 또는 두 개의 포인터가 가리키는 더 정확하게 동일한 메모리 영역을 삭제한다는 것입니다

*p = *x;