때로는 std::vector
의 시작 주소를 사용하고 일시적으로 해당 주소를 정기적으로 할당 된 버퍼의 주소로 처리하는 것이 유용합니다.
예를 들어이 대체 :이C++ : std :: vector의 시작 주소를 얻는 중입니까?
char* buf = new char[size];
fillTheBuffer(buf, size);
useTheBuffer(buf, size);
delete[] buf;
을 :
vector<char> buf(size);
fillTheBuffer(&buf[0], size);
useTheBuffer(&buf[0], size);
이의 장점은 버퍼가 자동으로 할당 해제됩니다 물론이고, 나는 delete[]
에 대해 걱정할 필요가 없습니다.
크기가 0 인 경우 문제가 발생합니다.이 경우 첫 번째 버전은 정상적으로 작동합니다. 빈 버퍼는 "할당"되고 이후 함수는 크기 == 0을 얻지 못합니다.
buf[0]
에 0 < size
이라는 어설 션이 포함될 수 있으므로 size == 0이면 두 번째 버전이 실패합니다.
벡터가 비어 있어도 벡터 시작 주소를 반환하는 이디엄 &buf[0]
대신 사용할 수있는 방법이 있습니까?
나는 또한 buf.begin()
을 사용하는 것으로 생각했지만 표준에 따라 포인터를 반환하지는 않습니다.
이것은 STL 라이브러리의 감독처럼 보입니다. C++은'new T [0]'을 할당하고 이와 같은 상황에 대해 유효한 포인터를 반환 할 수있게 해줍니다. 그러나 STL의 대부분의 구현은 당신이 그 요소 나 다른 것에 할당하는 경우를 위해서만합니다. – AshleysBrain
'& buf [0]'과'buf [0] = 1'의 차이를 어떻게 알 수 있습니까? – shoosh