2012-06-08 3 views
0

나는 두 배 배열에 포인터의 벡터를 창조한다. 함수 (예 : InsertIntoVector)가 종료 된 후이 포인터가 유효합니까? 나중에 GetVecElement과 같이 포인터를 가져 오는 경우 포인터는 할당 된 동일한 메모리 위치를 포인터로 가리킬 수 있습니까?참조를 벡터로 푸시하는 것은 함수가 종료 한 후에 유효한 참조입니까?

class A { 
    vector<double*> vec; 

    void insertIntoVector(double x, double y); 
    void GetVecElement(int i, double& x, double& y); 
}; 

A::insertIntoVector(double x, double y) { 
    double* xy = new double[2]; 
    xy[0] = x; xy[1] = y; 
    vec.push_back(xy);  
} 

A::GetVecElement(int i, double& x, double& y) 
{ 
    x = vec[i][0];  // will the reference to the double array still be valid? 
    y = vec[i][1]; 
} 
+2

이는 참조가 아닙니다! 참조 벡터가 없습니다. 그것들은 _poi입니다. nters_ –

+0

stackoverflow가 새로 도입되었지만 이전 답변을 지금 받아 들였습니다. 그래서 죄송 합니다만 포인터는 예를 들어 언급하지 않습니다. –

답변

2

사람들은 참조하지! 나중에 GetVecElement에서와 같이 포인터를 가져 오는 경우 사람들은 여전히이 할당 된 동일한 메모리 위치를 가리 키도록 보장 참조입니다, 포인터 ...

입니까?

포인터를 삭제하지 않으므로 std::vector이 처리하지 않으므로 포인터는 유효합니다. A의 소멸자에서 수동으로 delete을 쓰지 않는 한, 으로 유출됩니다. 그러나 그 경우 vector의 내용을 복제하기 위해 복사 생성자할당 연산자이 필요합니다.

+0

나는 누출을 아주 잘 이해하지 못한다. 그래서 내 프로그램이 종료 될 때 그 기억은 여전히 ​​열리고있다. 하지만 최신 OS가 결국 메모리를 정리하지 않습니까? 나는이 숨어있는 기억에 대해 정말로 염려해야 하는가? 나는 나쁜 습관을 알고 있지만 그 결과는 무엇입니까? –

+0

@dr_rk : 고의적으로 나쁜 습관을 따르는 결과는 나쁜 프로그래머가되는 것입니다. –

+0

벡터를 여러 번 삭제 한 다음 요소를 다시 추가 한 다음 다시 삭제한다고 상상해보십시오 (광고 infinutum) . 매번 할당 한 메모리는 삭제하지 않기 때문에 응용 프로그램의 수명이 다할 때 재사용 할 수 없습니다. 이로 인해 메모리 단편화가 발생합니다. – mathematician1975

0

GetVecElement 함수를 사용하여 참조 인수를 통해 얻은 값은 벡터의 요소 (insertIntoVector()에서 할당 한)가 가리키는 스택의 값입니다. 이러한 요소를 삭제하지 않으므로 코드에서 (또는 적어도 나타나는 것처럼) 이러한 값은 계속 유지되지만 본질적으로 여기에있는 것은 메모리를 정리하는 추가 코드가 없거나 예제에서 업로드하지 않은 메모리 누수입니다. 벡터가 삭제되거나 지워지면 메모리 위치가 벡터의 이중 * 요소로 지정됩니다.이 코드는 코드를 정리하기 위해 적극적으로 구현하지 않는 한 유지됩니다 (좋은 생각이 될 수 있음).

관련 문제