2012-11-03 2 views
3

저는 C++을 처음 사용하며 현재 newdelete 키워드를 공부하고 있습니다. 내가 & ppaa를 사용하여 위의 ppaa을 삭제할 수없는 이유 메모리 위치가있는 C++ 삭제 연산자

Point ppaa = *new Point; 
Point *p = &ppaa; 

ppaa.xpos = 1; 
ppaa.ypos= 3; 

delete &ppaa; 
delete p; 

당신이 설명해 주시겠습니까? 삭제가 포인터에서만 작동 할 수 있다는 것을 알고 있지만 실제로 메모리 위치이므로 위의 이유가 이해되지 않습니다. 유사한 질문을 검색하면 첫 번째 행에서 발생하는 복사 작업과 관련이있는 것으로 보이지만 좋은 설명이 없습니다.

+0

메모리가 누출됩니다. 도움이 될 수 있습니다 : http://stackoverflow.com/questions/8839943/why-does-the-use-of-new-cause-memory-leaks/8840302 – Pubby

+0

Pubbu 감사합니다, 그것은 많이 도움이되었습니다. Als의 대답에 게시 된 추가 질문을 살펴 보시기 바랍니다. – noclew

답변

3
T t = x; 

복사 초기화로 알려져 있습니다. 그것은 :

  • 그것은 &
  • 유형 T의 객체에 x 변환하려고 그런 다음에 초기화 된 객체 t에 해당 객체의 사본 이상.

그래서 코드 문,

Point ppaa = *new Point; 
  • 는 freestore/힙에 Point obejct 및 스택 객체 ppaa를 만들 개체를 다음
  • 사본을 작성합니다.

이 두 개체는 서로 다른 개체입니다.
이 문장을 실행 한 후에는 더 이상 힙 개체에 대한 포인터가 없습니다.
new에 의해 반환 된 주소를이 경우 delete으로 전달해야합니다. 주소가 더 이상 없으므로 메모리 누수가 발생합니다.
또한 &ppaanew에 의해 반환 된 주소를 반환하지 않으며 스택에있는 ppaa 개체의 주소를 반환합니다. 이 주소를 delete으로 전달하면 이 표시됩니다. ppaa이 freestore/dynamic에 할당되지 않았기 때문에은 스택 기반 로컬/자동 개체입니다.

+0

친절하게 설명해 주셔서 감사합니다. 이제 코드가 어떻게 작동하는지 확인할 수 있습니다. 나는 C#을 잠시 사용했기 때문에이 Copy Initialization은 꽤 흥미 롭습니다. 그냥 분명히하려면, 내가 C# (C++이 아니다)처럼 이렇게 쓰면 : T t1 = new T(); Tt2 = t1; 그러면 t2는 t1의 참조 일 뿐이며 C++와 같은 복사 프로세스가 없습니다. 내가 맞습니까? – noclew

+0

@noclew 맞습니다. – Pubby

+0

감사합니다. Pubby와 Als! – noclew