2014-06-06 3 views
1

함수 내에서 unordered_set에 데이터를 저장 한 다음 저장되는 객체에 대한 포인터를 반환하는 경우 함수의 범위 밖에서 포인터가 여전히 유효합니까?기능이 끝나면 std :: unordered_set의 데이터가 삭제됩니까?

예 :

int *myFunc(){ 
    std::unordered_set<int> hashset; 

    //add some objects 
    hashset.insert(4); 
    hashset.insert(5); 
    hashset.insert(6); 

    int *intptr = &(*hashset.insert(4)); //try to insert an object that may already be in the set, and get a pointer to the object in the set 
    return intptr; 
} 

다른 기능에서 오류가 발생하여 *intptr에 액세스하려고합니까? 또는 unordered_set의 범위가 끝날 때 unordered_set의 데이터가 할당 해제됩니까?

+0

http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – chris

답변

3

예에서, unordered_set의 소멸자가 호출 될 때, 즉 함수가 범위를 벗어날 때 파괴 된 객체를 반환합니다.

unordered_set에 포함 된 요소가 동적으로 할당되었지만 요소가 유효한 키 또는 값을 포함하는 개체를 의미한다고해도 세트 자체가 삭제되면 해당 요소도 파괴됩니다.

실제적으로 데이터에 액세스 할 수 있고 오류가 발생하지 않을 수 있습니다. 하지만 안전하지 않으므로이 상황을 고려하면 안됩니다.. 그것이 잘못되었다고 생각하십시오.

필요한 것을 얻으려면 세트 안에 포함 된 개체의 내부 초기화를 직접 처리해야합니다. unique_ptr<int>은 트릭을 수행 할 수 있습니다. 값을 반환하면 세트가 파기 될 때 값이 이동하고 객체의 할당이 해제되지 않기 때문입니다.

2

짧은 대답은 예입니다.

함수가 호출 된 후 해시 집합 개체 내부의 메모리가 유효하지 않은 것으로 간주되어야합니다. 따라서 해당 객체의 내부에 대한 포인터를 반환하면 정의되지 않은 동작이 발생합니다.

더 긴 대답은 아마도 것입니다.

그러나 함수가 반환 된 후 해당 메모리의 상태는 변경되지 않을 수 있습니다. 따라서 메모리가 유효하지 않더라도 코드에서 "올바른"결과를 얻을 수 있습니다.

가장 긴 대답은 이에 달려 있습니다.

메모리 처리 방법은 실행중인 플랫폼에 따라 크게 달라집니다. 메모리 제약 시스템은 데스크탑과는 매우 다른 메모리 관리를 수행 할 수 있습니다.

+2

+1,하지만 OP로 분명히하기 위해 : 짧은 답변 유일하게 유효한 답변이며, 나머지는 의존 할 수없는 구현 별 동작에 대한 힌트입니다. 컨테이너가 범위를 벗어나면 모든 요소가 삭제됩니다. –