여기서 무엇을 잘못하고 있습니까? 하나는 수동으로 메모리를 관리하는 것입니다.
#include <memory>
struct Package_Node
{
int bar_code;
float package_weight;
std::unique_ptr<Package_Node> next_packaged;
};
struct Key_Node
{
int key;
std::unique_ptr<Package_Node> next_package;
};
는
reset(new Package_Node())
을 사용합니다
unique_ptr
에 대한 포인터를 저장합니다.
delete
대신
reset()
으로 전화하십시오.
unique_ptr
이 가리키는 항목은
unique_ptr
이 삭제되면 자동으로 삭제됩니다.
이것은 C++ 11 - C++ 03의 경우 std::tr1::unique_ptr
또는 boost::unique_ptr
일 수 있지만 이동 의미가없는 경우 unique_ptr
은 사용하기가 더 위험합니다. 위의 할 경우
지금, 당신의 코드는 훨씬 짧은되고, 전체 연결리스트를 할당 해제하는 .reset()
첫 번째 노드에 스마트 포인터의 문제입니다 : 다른 모든이 자동으로 삭제됩니다!
그러나이 작업을 수행하지 않을 수도 있습니다. 따라서 코드에서 다른 문제를 공격 할 것입니다.
변수 이름에 값의 사용이 반영되지 않습니다. nPointer4
은 끔찍한 변수 이름입니다. 그 목적이 무엇인지 문서화하는 PointerToDelete
을 시도하십시오. 또한 초기화 시점에서 포인터를 선언하고 포인터를 사용 전후에 처리하지 말고 유효하지 않은 순간에 포인터를 지워야합니다. (변수를 재사용 할 때 보너스 포인트가 없습니다.) nPointer3
및 nPointer4
이 while
의 시작에 동일한 데이터를 유지해야
가
nPointer3=keyMain[i].next_package;
nPointer4=keyMain[i].next_package;
while(nPointer3)
{
nPointer4=nPointer4->next_packaged;
delete[] nPointer3;
nPointer3=nPointer4;
}
노트, 왜 그들은 모두 존재 :
이 루프를 보면? 이 같은 재 작성하여 상태를 반으로 줄일 수있다 : ptrToDelete
만이 초기화되는 순간에 존재하는 방법
Package_Node* ptrToDelete=keyMain[i].next_package;
while(ptrToDelete)
{
Package_Node* nextPtr = ptrToDelete->next_packaged;
delete ptrToDelete;
ptrToDelete = nextPtr;
}
알 수 있습니다.
가능한 한 짧은 시간에 nextPtr
이 존재하고 범위를 벗어납니다. 또한 초기화 된 후에 만 존재합니다.
다음으로 항상 문제를 실제로 보여주는 컴파일 코드를 게시하십시오. 위의 코드는 문제와 전혀 관련이없는 이유로 컴파일되지 않으며 마음을 읽는 것은 사람들에게해야 할 일이 아닙니다.
무엇이 잘못되었는지를 모르는 것이므로 무엇이 중요하거나 중요하지 않은지 어떻게 알 수 있습니까?Easy : 컴파일러가 알아낼 수 있도록하십시오. 문제를 보여주고 컴파일하고 문제가 계속 발생하는지 테스트 한 간단한 예제를 작성한 다음 이 인 게시하십시오.
문제가있는 대신 부품을 제거하여 짧게 만들거나 문제가 있거나 그렇지 않을 수도있는 컴파일되지 않는 코드를 게시하고 다른 사람들이 마음을 읽을 수 있기를 바랍니다.
struct Package_Node*
의 사용은 완전히 불필요합니다. Package_Node*
은 더 짧으며 (극단적 인 일부 경우는 제외) 완전히 똑같습니다.
똑똑한 포인터를 사용하지 않더라도 포인터를 소유 한 struct
은 소멸자에서 포인터를 소유해야하며 그렇지 않은 경우 다른 포인터가 있어야합니다. RAII 님은 친구입니다. 포인터를 소유 한 struct
을 만들 때 rule of three을 따르는 것을 잊지 마십시오.
nPointer3에서 가리키는 메모리가 할당 된 행을 표시 할 수 있습니까? – Digikata
'Package_Node' 엘리먼트에'delete []'를 사용하는 이유는 무엇입니까? 배열 인 경우 나머지 배열은 어떻게됩니까? –
@ChrisDodd'Package_Node'는 배열이 아닙니다. 연결된 목록입니다. 그러나 Key_node는 배열입니다. –