2017-11-27 20 views
-2

나는 다음을 수행 할 작업 :C++ 범위를 벗어난 후 std :: vector 데이터를 할당 해제하지 않는 방법은 무엇입니까?

{ 
    std::vector<int> a; 
    ... 
    result.aData = a.data(); 
    return result; 
} 

그러나 범위 내가 원하지 않는 끝날 때이 분명히 데이터의 할당을 해제합니다. 내가 그이 할 수있는 본 것은입니다 :

{ 
    std::vector<int> *a = new vector<int>(); 
    ... 
    result.aData = a->data(); 
    a = nullptr; 
    return result; 
} 

하지만 동적 할당을 피하기 위해 같은 것은, 사람이 어떻게 이런 짓을 했을까 방법 어떤 생각을 가지고 있습니까?

감사합니다. :)

+2

왜 '결과'에 원시 포인터가 있어야합니까? 누가 데이터를 소유해야합니까? –

+1

그러나 '벡터'는 동적으로 내부 저장소를 할당하므로 어쨌든이를 피하지 못합니다. 무엇을 성취하려고합니까? – Useless

+2

쉽습니다! 'return a;'또는'result.a = std :: move (a); return result;' –

답변

0

는 해결 방법이 있다는 것을하지 않는다. 그러나 std :: vector는 메모리 자체를 동적으로 할당하므로 완전히 피하는 것은 불가능 해 보입니다.

한 가지 가능한 해결 방법 :

단순히 함수의 벡터를 작성하고 그것을 반환한다. 실제로는 사본이 반환됩니다.

{ 
std::vector<int> a; 
... 
return a; 
} 

A는 여전히 해제되지만 복사본은 모든 것을 포함합니다 :

그래서 첫 번째 예는 될 것입니다.

다른 해결 :

대신 새로운 벡터를 생성하는 벡터 가변 부재 m_vector 있고 계산 함수에 그렇게 사용한다.

{ 
// Do something with m_vector 
return m_vector; 
} 

할당 해제는 발생하지 않지만 여전히 복사본을 만들어야합니다. 복사본을 만들지 않으려면 함수에서 참조를 반환 할 수 있습니다. 그러나 참조를 반환하면 잠재적으로 여러 인스턴스에서이를 사용하려는 경우 도로를 따라 물건을 조일 수 있습니다.

그러나 일반적인 XY 문제처럼 잘못된 방식으로 문제를 해결하려고하는 것처럼이 전체 설정 소리가 들립니다. 원래 문제에 대한 도움을 요청하는 것이 더 나을 것입니다.

0

벡터에서 원시 데이터를 반환하고 벡터를 파괴하는 것은 불가능합니다. 잠시 동안 어딘가에 벡터를 저장하거나 원시 메모리 할당 만 사용해야합니다.

벡터에서 반환 된 원시 포인터를 사용하면 벡터 내용을 수정하는 함수를 처음 호출하기 전에 만 안전하다는 것을 기억하십시오. 귀하의 질문에

두 번째 예는 메모리 누수, 그래서