2012-11-15 4 views
4

함수에 char *이 필요한 경우 shared_ptr을 전달할 수 있습니까?raw 포인터 인수에 대한 shared_ptr

전체 텍스트 파일 (길이 = 100)을 읽고 char [char] 배열에 char을 저장하려고합니다. 물론

ifstream dictFile(fileName); 
size_t fileLength = 100; 
char* readInBuffer(new char[fileLength]); 
dictFile.read(readInBuffer, fileLength); 
//processing readInBuffuer.............. 
delete[] readInBuffer; 
dictFile.close(); 

예외는 삭제 [] 문 앞에 던져진다면 메모리 누수가 : 내가 사용하는 순진 방법이 있었다. 사용할 수 있는지 궁금하네요. shared_ptr readInBuffer (new char [fileLength]); 그러나 함수 프로토 타입

읽기 (의 char * s의 streamsize의 N)

입력으로 스마트 포인터를 받아 들일 것인가? 어떤 속임수?

편집 :이 같은 작성하려고 해요 :

shared_ptr<char[]> readInBuffer(new char[fileLength]); 
dictFile.read(readInBuffer.get(), fileLength); 

를하지만 컴파일되지 않습니다.

+0

[공유 \ _ptr에서 정상 ptr을 얻을 수 있습니까?] (http://stackoverflow.com/questions/505143/getting-a-normal-ptr-from-shared-ptr) –

+1

당신은 이미 귀하의 질문에 대답 - 일반 포인터'get()'메서드를 가지고 있지 않지만 스마트 포인터 않습니다 그리고 당신이 요구하는 정확히 않습니다. –

+0

'shared_ptr '은 배열을 관리 할만큼 똑똑하지 않습니다. 그러나 unique_ptr은 사용자 정의 deleter를 제공하면됩니다. –

답변

2

BIG FAT 경고 : 스마트 포인터하지 delete[]에게 그것을 포인터 delete 때문에 배열을 가리키는 shared_ptr 만들기 정의되지 않은 행동을 불러 일으킨다. 대신 vector을 사용하십시오!

유용한 경고로 사용할 수 있으므로 여기에 그대로 두십시오. 원래의 대답은 다음과 같습니다 ...

get() 함수는 기본 원시 포인터를 반환합니다. 이미 코드에이 코드를 작성했습니다.

shared_ptr<char> readInBuffer(new char[fileLength]); 
dictFile.read(readInBuffer.get(), fileLength); 

&*readInBuffer으로 동일한 결과를 얻을 수 있습니다.

물론 dictFile.read()은 포인터가 delete이 아니거나 악마가 코에서 날아갈 수도 있습니다.

+0

커스텀 Deleter가 없다면,'unique_ptr'는 단순히 저장된 포인터에서'delete p'를 호출 할 것입니다. 메모리는 new 배열로 할당 되었기 때문에 정의되지 않은 동작이 발생합니다. –

+0

아, 네, 맞아요. 여기에두고 큰 뚱뚱한 경고를 추가합니다. – Thomas

+0

오우, 뒤로. ''내 의견은 결국'shared_ptr'을 의미 할 때'unique_ptr'에 대해 이야기하게되었습니다. 'shared_ptr'는 단순히 배열을 처리하지 않습니다; 'shared_ptr'에 대한 커스텀 deleter는 없습니다. 그러나 여기서는 'unique_ptr'을 사용할 수 있습니다. –

5

대신 포인터를 사용하는 대신 벡터를 사용할 수 있습니다.

std::vector<char> readInBuffer(fileLength); 
dictFile.read(&readInBuffer[0], fileLength); 
+0

벡터 트릭 좋은 ...따라서 API가 원시 포인터를 필요로 할 때 스마트 ptr을 전달할 수있는 방법은 없습니다. –

1

아니요, shared_ptr을 전달할 수 없습니다. 그러나 하나를 생성하고 get() 멤버 함수를 호출하여 함수에 전달할 원시 포인터의 복사본을 얻을 수 있습니다. 그러나 shared_ptr은 배열을 처리하지 않습니다. 그것은 vector을위한 것입니다.

std::unique_ptr<char[], std::default_delete<char[]> ptr(new char[whatever]); 
f(ptr.get()); 

첫 번째 라인을 작성하는 짧은 방법이있을 수 있습니다,하지만 난 그것을 발굴 할 시간이 없어 :하지만 당신은 그 객체를 관리하기 위해 배열에 unique_ptr를 사용할 수 있습니다.

관련 문제