2011-03-09 5 views
5

다음 방법을 사용하여 할당 된 리소스를 회수하는 방법에 대해 걱정하지 않고 할당 된 메모리 공간을 얻습니다.C++ - 벡터에 대한 내부 포인터 얻기

#include <vector> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    vector<int> vecInts; 

    for(int iInd=0; iInd<10; i++) 
     vecInts.push_back(iInd); 

    int* pInt = &vecInts[0]; // Is this a good method? 

    // now can I use pInt to modify the value of the vecInts? 
    // I will NOT resize the vector and just simply manipulate the values inside 
    return 0; 
} 

그러나 이러한 방법이 좋은지 아닌지 잘 모르겠습니다.

은 (범위 등 밖으로 사라 벡터에 대한 포인터를 사용하지 않는 것처럼, 다른 명백한 사람)에게

답변

5

당신이 언급 네, 잘 주었어요주의 사항을 감사드립니다. 포인터는 컨테이너에 대한 반복자와 동일한 방식으로 유효하고 무효화됩니다.

+0

우리는 이것을 Hack이라고 부를 수 있을까요? std :: vector는 const T * Get이라는 함수를 제공하지 않으므로? - 고마워. – q0987

+2

아니, 이건 해킹이 아니야. 벡터는 C 프로그램이 배열을 사용하는 장소에서 사용되기로되어 있습니다. –

+0

제 생각에는 합리적이지 않습니다. 안전하다는 것은 잘 알려져 있으며 때로는 유용합니다. 예를 들어, http://en.wikipedia.org/wiki/Vector_(C%2B%2B)는'memcpy'와'printf' 호출과 함께 포인터를 사용하는 것을 보여줍니다. 이터레이터에 익숙하다면, 주소를 ala'& (* v.begin())'(마찬가지로''v.size()> 0' ''일 때만 유효합니다.). –

3

좋은 방법입니다. 벡터가 범위를 벗어나면 메모리는 자동으로 해제됩니다. 현대의 STL 구현에서 vector&v[0]과 같은 메모리 시작 포인터를 반환하는 메서드 data()을 가지고 있지만 훨씬 더 깨끗해 보입니다.

이 접근법에는 각 요소가 0 (또는 개체 인 경우 기본 구성)으로 설정되는 nice 속성도 있습니다.

벡터의 길이를 미리 알고 있으면 효율성을 위해 생성자 인수로 제공 할 수 있습니다. 그러면 모든 메모리가 한 번 할당됩니다. 예 :

vector<char> buffer(bufSize); 
fread(buffer.data(), 1, buffer.size(), file); 

그리고, 당신은 코멘트에 언급처럼, 버퍼 크기를 조정할 경우 buffer.data()가 변경된다는 점에 유의하고,이 범위를 벗어나면 해제.

관련 문제