2013-09-05 2 views
3

나는 간단한 질문을했습니다. 나는 해답을 찾고 있었지만 해를 찾기위한 올바른 태그 나 단어를 찾지 못했을 수도 있습니다 ...C++ 예약 된 메모리가있는 로컬 변수를 해제해야합니까?

질문 : 제목이 말하는대로 : 예약 된 메모리를 가진 로컬 변수가 있어야합니까? 해방?

myClass* myFunction(){ 
myClass* A = new myClass; 
return A; 
} 

"예", 어디를 호출해야 할 경우 "삭제"나는, 예를 들어, 나는 다음과 같은 기능을 가지고 것을 의미한다면? "돌아 오는"전후 모두 말도 안돼 ...

맞습니까?

+1

'myClass'가'myClass' 포인터를 사용하는 생성자를 가지고 있지 않으면 C++에서 질문이 의미가 없기 때문에 대답이 없습니다. – juanchopanza

+3

나는 당신이 자바 또는 C#에서 왔을거야! –

+0

자바에서 왔어 ... 그게 내가 그 문제에 익숙하지 않은 이유 ... 미안, 질문이 어리 석다면 – Bardo91

답변

13

필요하지 않은 한 new을 사용하지 마십시오.

이렇게하면 포인터가 필요하다고 생각하는 경우

myClass myFunction(){ 
    myClass A; 
    return A; 
} 

삭제해야합니다 스마트 포인터를 사용하는 것을 고려하지 않도록 new을 방지합니다.

원시 포인터의 흥분을 원할 경우이 함수는 호출자에게 원시 포인터를 반환하고 완료되면 삭제해야합니다.

myClass * myFunction(){ 
    myClass * A = new myClass; 
    return A; 
} 

myClass * thing = myFunction(); 
//stuff, that might throw an exception, so watch it 
// smart pointers FTW 
delete thing; 
4

당신의 유형은 다음과 같이 뭔가를 정의된다고 가정 : (당신이 myClass* 변환 생성자, 당신은 아마하지 않습니다하지 않는 한)

class myClass { /* ... */ }; 

귀하의 예는 ++ 적절한 C 없습니다. 당신은 new에 자동 메모리에 앉아 객체가없는

:

newing이 동적 메모리에서 개체, 당신은 다음 자동 메모리 포인터 변수에 넣어 수 있습니다
myClass myFunction(){ 
    myClass a; 
    return a; 
} 

:

myClass* myFunction(){ 
    myClass* a = new myClass; 
    return a; 
} 

여기에서 a은 발신자가 해제하지 않은 경우 누출 될 수 있습니다. 당신은 몇 가지 흥미로운 연산자 오버로딩을 수행하지 않는 한

2

아마, 당신이 그런 경우 포인터를

myClass *myFunction(){ 
    myClass *A = new myClass; 
return A; 
} 

를 포인터로 새 myClass가 할당하고 반환하는 것을 의미하고 그래, 당신은 삭제해야합니다 어떤 점에서. 포인터를 유지하고 적절할 때 포인터를 지우는 것은이 함수의 호출자에게 달려 있습니다.

스마트 포인터를 사용할 수도 있습니다.

1

원시 포인터 대신 shared_ptr을 사용하십시오.

std::shared_ptr<myClass> myFunction() 
{ 
    std::shared_ptr<myClass> A = std::make_shared<myClass>(constructor parameters, if any); 
    return A; 
} 

void f() 
{ 
    std::shared_ptr<myClass> A = myFunction(); 
} 

Java 스타일 가비지 수집을 에뮬레이션합니다.