2013-08-11 5 views
0

내가이 코드를 가지고 있다고 가정 해 봅시다.함수에 의해 반환 된 포인터를 수동으로 삭제

int* Func(std::vector<int> integers) 
{ 
    for (int i : integers) 
    { 
     if (something) 
     { 
      return &i; 
     } 
    } 

    return nullptr; 
} 

int* x = Func({3, 4, 5, 6, 7}); 
delete(x); ??? 

'x'(nullptr이 아닌 경우)를 삭제해야합니까? 늘어나는만큼 우리는 연산자 'new'로 할당 된 메모리를 해제해야합니다. 이것은 분명히 여기에 해당하지 않습니다.

+3

당신은 지역 변수에 대한 포인터를 반환하는 :

당신이 C++ (11)를 사용하고 있기 때문에, 여기에 당신이 달성하려고하는 생각입니다. 이것은 삭제 여부와 상관없이 정의되지 않은 동작입니다. 일반적으로 호출자가 삭제해야 할 수도있는 원시 포인터를 반환하는 함수는 없어야합니다. – juanchopanza

+1

[로컬 변수의 메모리를 범위 외부에서 액세스 할 수 있습니까?] (http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope) – chris

답변

1

이 아니기 때문에 new이 아니기 때문에 정확합니다. 코드 단편에서 가장 큰 문제는 로컬 변수 i에 대한 포인터를 반환한다는 것입니다. 이것은 리턴 된 포인터가 정의 된 의미를 갖지 않음을 의미합니다.

+0

무엇을 의미합니까? Func()의 조건이 (i == 5)이고 int * x = Func (...) 인 경우 'x'는 5가됩니다. gcc를 사용하고 있습니다. – user361633

+1

'for (int i : integers)'는 지역 변수'i'를 만듭니다.이 변수는 5 일 수도 있지만'Func'에서 돌아 오면 범위를 벗어나서 저장된 메모리가 더 이상 예약되지 않습니다. 당신이 그것을 읽기 전에 다른 사람이 그것을 덮어 쓸 수 있습니다. – DrYap

2

짧은 답변 : 당신은 당신이하지 delete해야 그 권리이지만, 그

당신은 지역 변수 (i)의 주소를 반환하는 ... 걱정거리입니다. 그것은 나쁜 업장입니다.

당신은 다음과 같이 (두 개의 추가 &의주의)이 문제를 해결을 시도 할 수 있습니다 :

int * Func(std::vector<int> & integers) { 
    for (int & i : integers) 
     if (something) 
      return &i; 
    return nullptr; 
} 

를하지만 그렇다하더라도 당신은 당신이 전달하는 벡터가 일시적이기 때문에, ({3, 4, …}를) 문제가 세미콜론을 지나기 전에 파괴됩니다. 사실, 우리는 이제 임시 값을 l 값 참조로 전달하려고하기 때문에 컴파일하지 않을 것이라고 생각합니다.

std::vector<int> integers = {3, 4, 5, 6, 7}; 
auto x = std::find_if(begin(integers), end(integers), [](int i) { return something; }); 
if (x != end(integers)) { 
    // Use *x… 
} else { 
    // Not found 
}