2014-10-16 2 views
0

nullptr이 할당 된 경우에도 포인터를 삭제해야하는지 묻습니다. 다음과 같은 경우에 예를 들어nullptr이 포인터의 메모리를 해제합니까?

:

std::string* foo = new std::string ("foo"); 
foo = nullptr; 

은 nullptr 이전에 점유 된 메모리는 해제 또는 우리는 메모리 누수에 직면하고있다?

+0

아니요. 메모리 누수입니다. – Galik

+0

아니요, 여기에 마법 메모리 할당 해제가 없습니다. 할당은 * 포인터 *의 값을 수정합니다. – juanchopanza

+0

누가 그렇게 말했습니까? ** 아니오! ** –

답변

10

아니요,이 코드는 new으로 할당 한 개체를 누수합니다.

개체가 new으로 할당 된 경우 delete으로 할당을 해제해야합니다. 포인터가 nullptr이 할당 된 경우에도 삭제해야하는 경우


은 내가 부탁 해요 같습니다.

사용하는 용어는 잘못된 방식으로 생각하고 있음을 나타냅니다. 삭제해야 할 포인터가 아니라 객체입니다. 포인터는 코드가 객체를 참조하는 방법 일뿐입니다. 포인터 변수는 객체의 주소를 포함합니다. 모두 동일한 객체를 참조하는 여러 포인터 변수를 가질 수 있습니다. 포인터를 삭제하지 않고 개체를 삭제합니다.

delete foo; 

는 순진하게도 당신이 의미로 그 생각을 할 수 포인터 foo는을 삭제 :

이제, 당신이 이런 식으로 할당 해제를 작성하는 것이 이상하게 보일 수도 있습니다. 그렇다고 그런 의미는 아닙니다. 즉, 은 주소가 foo에 저장된 객체를 삭제합니다.

0

코드에서 각각 새 코드에 대해 delete를 사용했습니다. 이것은 분명히 메모리 누수입니다.

메모로 편집 : 스마트 포인터를 사용하는 경우 확실히 메모리 관리 세부 사항에 신경 쓰지 않아도됩니다.

+0

스마트 포인터를 사용할 필요는 없습니다. –

+0

@NeilKirk "스마트 포인터를 사용하고 있다면 '새로운'을 사용하지 않는다는 것이 었습니다. 그때 그것은 뻔뻔스럽게 잘못 되었기 때문에 나 자신을 찼습니다. 어쩌면 @ravi는 잠재적 인 메모리 누수가있을 때만 "각각의 새로운/원시 포인터 쌍"을 읽는 답을 변경해야합니까? – Baldrickk

0

new를 통해 할당 된 메모리는 delete를 통해 할당 해제되어야하며 그렇지 않으면 메모리 누수가 발생합니다.

std::string *p = new std::string[10]; // more than one 

할당 해제 등 : 당신이로 할당하는 경우

delete p; 

:

std::string *p = new std::string(); 

할당 해제 등 : 당신이로 할당하는 경우 는

delete [] p; 
3

이 메모리 누수입니다 . 그러나 객체가 자동으로 삭제되기를 원하는 것은 무리가 아닙니다. 이것은 표준 라이브러리에 의해 지원됩니다 : 그것을 수동으로 메모리를 관리하기 위해 불필요하게 어렵 기 때문에 코드에 new 또는 delete이 나쁜 스타일을 고려

std::unique_ptr<std::string> foo = new std::string ("foo"); 
//better: 
auto foo = std::make_unique<std::string>("foo"); 
//also see std::shared_ptr and std::make_shared 
foo = nullptr; //automatically deletes the string 

.

관련 문제