2013-07-03 3 views
2

하지 않는 것이 맞습니까? 사실 하나의 포인터에서 여러 번 새로운 것을 사용하는 것입니다 :포인터를 새로 고칩니다.

double * a; 
a=new double (5); 
cout<<*a<<endl; 

a=new double(10); 
cout<<*a; 
delete a; 

고마워요.

해결 방법 : 그래서 가능한 해결책은?! 첫 번째 할당 된 메모리가 누출 -

double * a=0; 

//... the code use *a to allocate or not some informations 

delete a; 

// ... the code continues with the possibility of allocate again using *a. 
+3

첫 번째 것이 유출됩니다. – Mysticial

+2

이 작업을 할 때마다 * 누출 될 것입니다. 포인터가 있어야한다면, 스마트 포인터와 그'reset' 함수를 사용하십시오. – chris

+0

@chris : * smart * 포인터의 요점은 자동으로 사업체를 재설정한다는 것입니다 ... –

답변

2

로 갱신 할 수 있습니다 널 포인터를 지우지는 않을 것입니다.) : 중요하지 않습니다. delete null 아무 작업도 수행하지 않습니다.

어떤 시점에서든 상태를 알 수있는 방식으로 코드를 작성하는 것이 좋습니다. 한 번만 포인터를 할당하십시오. 귀하의 질문에 관용구를 사용하려면 스마트 포인터를 사용하십시오 (재설정되거나 범위를 벗어남에 따라 삭제 작업이 수행됩니다).

std::auto_ptr a; 
a.reset(new double(5)); 
cout << *a << endl; 

a.reset(new double(10)); 
cout << *a << endl; 

// no need to call delete at all. std::auto_ptrs destructor will do it for you. 
2

괜찮아 아니다 : 빈 셀에 포인터 a 점, 그것은 NULL 포인터를 사용할 수 있는지

double * a; 
a=new double (5); 
cout<<*a<<endl; 
delete a; 
a=new double(10); 
cout<<*a; 
delete a; 

이 경우에 우리는 알지 못한다. 그러나 주된 이유는 관용적 인 C++가 아니기 때문입니다. 평범하지 않은 무엇이 잘못 되었습니까?

double a; 
a = 5; 
cout << a << endl; 

a = 10; 
cout << a; 
1

아니요, 메모리 누수가 발생합니다. 모든new에는 해당 delete이 필요합니다.

1

a=new double(10);하기 전에 먼저 delete a;이 필요합니다. 그렇지 않으면, 당신은 작은 메모리 누수로 끝날거야, 당신이 메모리를 요청한 다음보고 나서 그것을 결코 풀어. 코드는 다음과 같아야합니다.

double *a = new double(5); 
cout << *a << endl; 
delete a; // note the delete 

a = new double(10); 
cout << *a; 
delete a; 
2

괜찮습니다. 포인터는 원하는 것을 가리킬 수 있기 때문입니다. 따라서 double* pdouble 유형의 모든 개체를 가리킬 수 있습니다.

그러나 특정 상황에서는 new 메모리 블록을 편집 한 다음 포인터가 대상을 변경하도록했기 때문에 완벽하게 정상적으로 작동하지 않습니다. 이전 5 메모리 블록에는 포인터가 지정되어 있지 않으므로 더 이상 액세스 할 수 없습니다. 그러나 여전히 메모리 블록을 차지합니다. 이것은 메모리 누수로 간주됩니다. 이 경우

, 당신은

std::shared_ptr<double> p(new(10.0)); 

같은 것을 사용할 수 있습니다 그리고 당신은 당신이 있는지 확인 어떻게 당신의 후속 질문 (에 대한 답변에서

p.reset(new(5.0)); 
+1

'std :: make_shared'를'new'로 선호하십시오. – chris

관련 문제