2014-03-28 4 views
3

파일 IO 라이브러리를 작성했습니다. 하나 개의 기능은 File::read은 다음과 같습니다 : 그것은 *tcount T를 읽어float 배열에 unique_ptr 사용

template <typename T> 
void File::read(T * t, unsigned long count) const 

.

이제 클라이언트로 건너 뜁니다. 내가 읽고 싶은 메모리 버퍼를 할당한다. 나는 이것을 작성했는데 효과적이다 :

float * buffer = new float [16]; 
file->read(buffer, 16); 

그러나 이것은 예외는 아니지만 안전하다. 그래서 나는 std::unique_ptr에 버퍼를 감싸기로 결정했다. 여기 어딘가에서 실수하고 있습니다.

std::unique_ptr<float[]> buffer (new float[16]); 
file->read(*buffer , 16); 

이 읽기> 파일 -에 다음과 같은 오류가 발생합니다 :

'운영자 *'아무 짝을

내가 생각 (피연산자 유형은 '표준 :: unique_ptr'입니다) 그것은 unique_ptr을 참조 해제함으로써 float[] 배열의 첫 번째 요소에 대한 포인터를 얻게됩니다. 내 실수는 어디에서 발생하며 수정 사항은 무엇입니까?

답변

5

두 번째 문제가 있습니다. 첫 번째는 의 배열에 대한 포인터가 float[]std::unique_ptr입니다.

다른 문제는 스마트 포인터가 일반 포인터처럼 작동한다는 것입니다. * 연산자를 사용하여 일반 포인터를 역 참조 할 때 더 이상 포인터가 없지만 값 (포인터가 가리키는 값)이 있습니다.


또한, 나는 나 대신 스마트 포인터의 std::vector (당신이 컴파일 타임에 크기를 알고있는 경우) 중 하나 std::array를 사용하는 것이 좋습니다 것입니다. 현대의 C++에서는 포인터에 대한 필요성이 거의 없습니다. 당신이 std::array이없는 경우

당신이 대신 std::vector을 사용할 수 있습니다

std::array<float, 16> buffer; 
file->read(buffer.data(), buffer.size()); 

처럼 사용할 수 있습니다

std::vector<float> buffer(16); // Create a vector of 16 floats, 
           // default initialized (i.e. 0.0) 

// &buffer[0] is a pointer to the first element in the vector 
// all vectors are guaranteed to be contiguous like normal arrays 
file->read(&buffer[0], buffer.size()); 
+0

나는 이진 파일에서 벡터로 읽는 방법을 모르는 것 (바이트 스트림), 나는 두렵다. 'File :: read' 호출은'count * sizeof (T)'바이트를'T * t'가 가리키는 메모리로 직접 읽어들입니다. 나는 나의 방법에 대한 해결책을 찾고있다. –

+0

오,'std :: array :: data'는 연속적이고 변경 가능한 메모리 블록에 대한 포인터를 반환하므로 읽을 수 있습니다! 그게 효과가있다. 고맙습니다. –

+0

내 (비추천) 스타일로 올바른 방법으로 게시 할 수 있습니까? 학습 목적으로 아는 것이 유용 할 수 있습니다. –