2010-03-23 2 views
2

꽤 많이 있습니다. 메모리를 할당하고 void *를 사용하는 함수에 전달해야합니다. shared_ptr을 사용하고 싶습니다만 어떻게 해야할지 모르겠습니다.공백을 차지하는 함수에 전달할 shared_ptr을 만드는 방법은 무엇입니까?

boost::shared_ptr<int> myInt(new int(5)); 

call_some_function(myInt.get()); 

이 만하자 함수가 int*를 사용

+0

이 함수는 인수로 무엇을합니까? 또한, 메모리를 char 배열로 할당하는 것이 가능할 것이라고 생각합니다 (예 :'std :: vector '로, 함수에 & vec [0]을 전달하십시오). – UncleBens

+0

이 함수는 google :: protobuf를 메모리에 직렬화합니다. 헤더가 앞에 추가되고 블록이 와이어를 통해 전송됩니다. – shaz

답변

5

당신은 같은 것을 의미합니까. 삭제하거나 소유권을 가져 가려고해서는 안됩니다.

std::vector<char> memory(blockSize); 

call_some_function(&blockSize[0]); 

가 다시 메모리가 vector에 속하는 :


그냥 원시 메모리하려는 경우

vector 사용합니다. 함수 소유권을 원하는 경우 당신이 그것을 관리되지 않기 때문에


, 무언가로 포장 할 필요가 없다 :

call_some_function(new int); 
call_some_function(new char[blockSize]); 

이 기능으로 해제됩니다 확인 delete/ delete[]으로 전화하십시오. 하지 (예를 들어,이 free()를 사용하고자하는) 경우, 대신 malloc를 사용해야합니다 : 당신은 또한 참조 카운트 메모리 덩어리 컨테이너로 표준 : : 문자열을 사용할 수

template <typename T> 
T* malloc_new(void) 
{ 
    void* memory = std::malloc(sizeof(T)); 
    if (!memory) 
     throw std::bad_alloc(); 

    try 
    { 
     return new (memory) T(); 
    } 
    catch(...) 
    { 
     std::free(memory); 
     throw; 
    } 
} 

call_some_function(malloc_new<int>()); 
call_some_function(malloc(blockSize)); 
+1

+1, 정말 좋은 답변입니다. 'new int (5)'가 호출 될 때'foo (bar(), new int (5))'가 누출 될 수 있습니다. 'bar()'와'bar()'가 예외를 던지기 전에 실행된다. 똑똑한 포인터를 사용하는 것이 더 안전합니다. (std :: auto_ptr p (new int (5)); foo (bar(), p.release());'좋지는 않지만 안전합니다. –

-3

. char * vector에서 shared_ptr만큼 효율적입니다 (아마도 더 좋을 것입니다)

+1

'std :: string'은 참조 카운트 된 컨테이너가 아닙니다. –

+0

확실하다 - 스펙은 필요하지 않지만 모든 실제 구현은 shared_ptr처럼 참조 횟수에 대한 스레드 안전성을 포함한다. – pm100

+2

VS/Dinkumware가 참조 카운팅이라고 생각하지 않는다. – GManNickG

관련 문제