2012-04-03 4 views
1

다른 클래스 중 하나 인 새 변수를 선언 할 수 있습니까? 예 : ? 다음 내가 원하는 내가라는 클래스 목록 및 (List 클래스에서 중첩) 노드를 가정 :C'tor in C++ 클래스

List::List(int num) 
{ 
Node Nod(num); //creating a new Node which is holding num 
List_Head=&Nod; //List_Head is a Node pointer variable of List class 
} 

나는, 나는 다음과 같은 런타임 오류 얻을 그렇게되면 :

디버그 어설 션이 실패했습니다!

표현 : _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse)

어떤 도움?

+0

이것은 기본 C++입니다. 로컬 (즉, 임시) 변수의 주소를 할당합니다.c'tor 스코프를 벗어나면 'Nod'가 삭제되고 List_Head가 가리키는 메모리도 삭제됩니다. – azf

답변

3

작성한 Nod의 범위와 유효 기간은 생성자 List::List()으로 제한됩니다. 로컬/자동 객체이기 때문에 생성자로 제한됩니다.

생성자가 반환되면 Nod이 존재하지 않으며 (List_Head)을 가리키는 아무것도가 정의되지 않은 동작 가장 가능성이 충돌을 일으킬 것 deferencing, 매달려 포인터이다.

생성자 본문 외에 참조하려는 경우 new을 호출하여 동적 메모리 (힙)에 Node을 작성해야합니다. 당신은 수동 메모리 관리를하지 않도록

List_Head = new Node(num); 

이상적으로, 당신은 스마트 포인터 대신 List_Head에 대한 원시 포인터의 일종을 사용해야합니다. 전화를 걸 수없는 경우 메모리 누수가 발생하지 않도록 사용을 마친 후에는

delete List_Head; 

번으로 전화해야합니다.

+0

그러나 동적 메모리에 노드를 만들면 포인터 일뿐입니다 .. 노드 * nod = 새 노드; 포인터가 아니라 Node 변수를 만들고 NUM을 삽입하려고합니다. 어떻게해야합니까? – Jjang

+0

@ user1309152 : 네, 그게 뭐가 잘못 됐나요? 할당 된 메모리를 가리키는 유효한 포인터가 있으면 모든 것이 안전합니다. –

0

이렇게하면 안됩니다. Nod은 생성자 (마지막 })의 끝에서 범위를 벗어나므로 메모리가 무효화됩니다. 즉, List_Head은 잘못된 메모리를 가리 킵니다. 당신이 주변에 메모리를 유지하려면

, 당신은

List_Head = new Node(num); 

그냥 delete 무엇 new해야

처럼, new을 사용해야합니다! 하지만 이걸 조심해야 해! 메모리를 삭제하지 않으면 메모리가 누출 될 수 있으며 올바르게 처리하지 않으면 메모리를 두 번 삭제할 수 있습니다. 특히, 할당 한 메모리를 적절하게 처리하려면 소멸자, 복사 생성자 및 할당 연산자를 구현해야합니다.

또는 C++ 11을 사용하는 경우 스마트 포인터 (예 : std::shared_ptr)를 사용하여 삭제를 처리하여 메모리를 누출하거나 메모리를 두 번 삭제하지 않아도됩니다. 클래스를 원하는 방식에 따라 복사 생성자와 할당 연산자를 정의해야 할 수도 있습니다 (맞춤 버전이 없으면 deep copy 대신 오브젝트의 shallow copy이 생길 수 있습니다. 당신이 원하는).

+0

감사합니다. List_Head가 없다고 가정합시다. 내가 어떻게 그럴 수 있니? – Jjang

+0

당신은 꽤 붙어 있어요. 클래스에 동적으로 멤버를 추가 할 수는 없습니다. – Cornstalks

관련 문제