2010-03-23 29 views
2

就是這麼多。我需要分配內存並將其傳遞給一個帶void *的函數。我想使用shared_ptr,但我不知道該怎麼做。如何創建一個shared_ptr傳遞給一個無效的函數*

+0

函數對參數做了什麼?另外,我認爲可以將內存分配爲char數組(例如,使用'std :: vector ',並將'&vec [0]'傳遞給函數)。 – UncleBens 2010-03-23 19:40:35

+0

函數將google :: protobuf序列化到內存中。一個標題被預置,並且該塊通過電線發送。 – shaz 2010-03-23 22:55:40

回答

5

你的意思是這樣的:

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

call_some_function(myInt.get()); 

這隻能讓的功能使用int*。它不應該試圖刪除它或取得所有權。


如果你想只是原始的內存,使用vector

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

call_some_function(&blockSize[0]); 

同樣,內存屬於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());'不好,但是安全。 – 2010-03-24 00:08:48

-3

你也可以使用的std :: string作爲引用計數的存儲BLOB容器。它與char * vector上的shared_ptr一樣高效(可能更好)

+1

'std :: string'肯定不是引用計數的容器。 – 2010-03-23 20:02:31

+0

確定它是 - 規範並不要求它是所有的實際實現 - 包括引用計數中的線程安全性就像shared_ptr – pm100 2010-03-23 20:05:27

+2

我不認爲VS/Dinkumware是引用計數。 – GManNickG 2010-03-23 20:24:11

相關問題