2016-11-11 2 views
3

내 코드는 내가 메모리가 주요 기능 할당과 재미를 참조 재미에 메모리를 삭제하여로 전달 삭제할 수참조로 전달 된 객체를 삭제할 수 있습니까?

fun(int &a) 
{ 
    delete &a; 
} 

main() 
{ 
    int *a = new int(10); 
    fun(*a); 
} 

다음과 같이인가? 올바른 방법일까요?

+0

이 더'C'입니다 .... –

+0

예 올바른 ... 당신이 그것을 시도하지 않았다? –

+0

나는 그것을 시험해 보았다. 하지만 이런 개체를 삭제하는 것을 본 적이 없으므로 dobt가 발생했습니다. –

답변

2

짧은 대답 : 예, 가능합니다. 하지 마십시오.

참조가 변경되지 않습니다. 즉, 주소 (컴파일러가 포인터로 참조를 구현 한 경우)는 변경 될 수 없습니다. 따라서 삭제하면 원래 참조가 할당되지 않은 메모리를 가리키고 충돌합니다.

또한 코드에서 배열의 첫 번째 (고유 한) 요소에 대한 참조를 전달하지만 (포인터를 배열로 생각하는 경우) 재미 있지만 배열의 크기는 알 수 없습니다. 배열입니다. 예 :

fun(int &a) 
{ 
    delete &a; 
} 

main() 
{ 
    int a = 42; 
    fun(a); 
} 

참조 주소를 삭제하려고 시도합니다. 예기치 않은 동작입니다.

+4

"또한 코드에서 배열의 첫 번째 요소에 대한 참조가 전달됩니다."- 아니요, OP는 그렇게하지 않습니다. 그건 제쳐두고,이 대답은 한 문장 설명 할 수없는 대답, 두 단락 논평입니다. 논평은 나쁘지는 않지만 (올바른 것으로 편집 된 경우), 답을 설명하고 싶을 수도 있습니다. – hvd

2

이 작업을 수행하지 마십시오

을 나는 이것이 미키 마우스 예이다 생각하지만, 현실 세계에서 : [시작

  1. 를 들어 문제의 intnew에 의해 만들어지지 않을 수 있습니다 - 다음은 많은 문제들
  2. 누가 문제의 물체를 소유하고 있는지. 기능이 아닙니다. 계약은 어디에 있습니까?

개체 소유자를 결정하십시오. 또한 "사람"이 new을 통해 생성하는 경우 delete 책임을 져야합니다.

체크 아웃 스마트 포인터는