1

C++에서 링크드리스트를위한 프로그램을 만들고있었습니다. 개념을 구현하기 위해 포인터의 '시작'을 전역 적으로 작성하여 목록의 첫 번째 요소를 가리 킵니다. 이전에 동적으로 할당되었지만 다른 포인터를 사용하여 메모리를 삭제할 수 있습니까?

프로그램 완료 후 나는 시작과 다른 로컬 선언 포인터 'P'를 사용하여 연속적인 노드에 액세스하여, 메모리 누수를 방지하기 위해 동적으로 할당 된 모든 메모리를 삭제하려고했습니다. 여기에서는 동일한 올바른 주소를 가리키는 포인터를 사용했지만이 포인터는 메모리 할당에 사용 된 포인터가 아니지만 일반적인 포인터처럼 로컬로 선언되었습니다.

내 질문은 - 같은 위치를 가리키는 일반 포인터를 사용하여 동적으로 할당 된 메모리를 삭제할 수 있습니까? 포인터는 new에서 돌아 왔을 것과 같은 유형과 값1을 가지고로

+1

[다른 포인터에서 할당 된 포인터 삭제 중 중복 된 포인터를 다시 삭제해야합니까?] (https://stackoverflow.com/questions/13259305/delete-pointer-that-is-assigned-from- another-pointer-should-i-delete-the-other) –

+1

포인터를 주소를 가리키는 것으로 생각하지 마십시오. 포인터를 주소라고 생각하면 (그리고 그 주소에있는 객체를 가리키고 있습니다). 35 메인 스트리트에서 주택을 철거하려는 경우 주소가 어떻게 전달되었는지는 중요하지 않습니다. 여전히 동일한 집입니다. – molbdnilo

+1

@molbdnilo : 당신도 37을 올릴 수 있을까요? 그런 다음 일출은 36 번에서 볼 수 있습니다. – Bathsheba

답변

4

예를 수행 할 수 있습니다. 이것은 유효합니다 new[]를 사용

int* p = new int; 
int* q = p; 
delete q; 

등가 : 포인터 유형

int* p = new int[123]; 
int* q = p; 
delete[] q; 

대체 int*. 나중에 포인터를 nullptr으로 설정할지 여부는 논쟁의 여지가 있습니다.

+0

const int * q = p; q를 삭제하십시오; 비록 내가 그것을위한 표준 심판을보고 싶지만, 또한 작동합니다. – Bathsheba

+0

@Bathsheba 실제로. 언뜻보기에 반 직관적 인 것처럼 보일지 모르지만 'const'는 죽을 수 없다는 것을 알 수 있습니다. – Ron

+1

@ Bathsheba C++ 14 [expr.delete]/2 최종주의 사항 –

1

너무 오래, 그래 당신은 delete 인수로 그것을 사용할 수 있습니다.

또한, 당신은 new[]를 사용한 경우 delete[]을 사용해야합니다.


1예선

( const, volatile) 문제가되지 않습니다. 당신은 또한 가상 소멸자와 기본 클래스에 대한 포인터를 사용할 수 있습니다.

+0

"동일한 유형": 동일한 유형으로 포함 된 가상 소멸자가있는 기본 클래스 – UKMonkey

+0

@UKMonkey, 그걸 꼬집고 위키가 명확한 양심을 유지합니다. – Bathsheba

관련 문제