nullptr이 할당 된 경우에도 포인터를 삭제해야하는지 묻습니다. 다음과 같은 경우에 예를 들어nullptr이 포인터의 메모리를 해제합니까?
:
std::string* foo = new std::string ("foo");
foo = nullptr;
은 nullptr 이전에 점유 된 메모리는 해제 또는 우리는 메모리 누수에 직면하고있다?
nullptr이 할당 된 경우에도 포인터를 삭제해야하는지 묻습니다. 다음과 같은 경우에 예를 들어nullptr이 포인터의 메모리를 해제합니까?
:
std::string* foo = new std::string ("foo");
foo = nullptr;
은 nullptr 이전에 점유 된 메모리는 해제 또는 우리는 메모리 누수에 직면하고있다?
아니요,이 코드는 new
으로 할당 한 개체를 누수합니다.
개체가 new
으로 할당 된 경우 delete
으로 할당을 해제해야합니다. 포인터가 nullptr이 할당 된 경우에도 삭제해야하는 경우
은 내가 부탁 해요 같습니다.
사용하는 용어는 잘못된 방식으로 생각하고 있음을 나타냅니다. 삭제해야 할 포인터가 아니라 객체입니다. 포인터는 코드가 객체를 참조하는 방법 일뿐입니다. 포인터 변수는 객체의 주소를 포함합니다. 모두 동일한 객체를 참조하는 여러 포인터 변수를 가질 수 있습니다. 포인터를 삭제하지 않고 개체를 삭제합니다.
delete foo;
는 순진하게도 당신이 의미로 그 생각을 할 수 포인터 foo는을 삭제 :
이제, 당신이 이런 식으로 할당 해제를 작성하는 것이 이상하게 보일 수도 있습니다. 그렇다고 그런 의미는 아닙니다. 즉, 은 주소가 foo에 저장된 객체를 삭제합니다.
코드에서 각각 새 코드에 대해 delete를 사용했습니다. 이것은 분명히 메모리 누수입니다.
메모로 편집 : 스마트 포인터를 사용하는 경우 확실히 메모리 관리 세부 사항에 신경 쓰지 않아도됩니다.
스마트 포인터를 사용할 필요는 없습니다. –
@NeilKirk "스마트 포인터를 사용하고 있다면 '새로운'을 사용하지 않는다는 것이 었습니다. 그때 그것은 뻔뻔스럽게 잘못 되었기 때문에 나 자신을 찼습니다. 어쩌면 @ravi는 잠재적 인 메모리 누수가있을 때만 "각각의 새로운/원시 포인터 쌍"을 읽는 답을 변경해야합니까? – Baldrickk
new를 통해 할당 된 메모리는 delete를 통해 할당 해제되어야하며 그렇지 않으면 메모리 누수가 발생합니다.
std::string *p = new std::string[10]; // more than one
할당 해제 등 : 당신이로 할당하는 경우
delete p;
:
std::string *p = new std::string();
할당 해제 등 : 당신이로 할당하는 경우 는
delete [] p;
이 메모리 누수입니다 . 그러나 객체가 자동으로 삭제되기를 원하는 것은 무리가 아닙니다. 이것은 표준 라이브러리에 의해 지원됩니다 : 그것을 수동으로 메모리를 관리하기 위해 불필요하게 어렵 기 때문에 코드에 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
.
아니요. 메모리 누수입니다. – Galik
아니요, 여기에 마법 메모리 할당 해제가 없습니다. 할당은 * 포인터 *의 값을 수정합니다. – juanchopanza
누가 그렇게 말했습니까? ** 아니오! ** –