2016-11-28 82 views
2

我需要一個類(在C++ 11中),它存儲了幾個字段(包括一個緩衝區)。我在構造函數中使用了malloc(),在析構函數中使用了free()(我沒有碰到C/C++很長一段時間,所以我都記得)。C++緩衝區疼痛

接下來我記得(因爲崩潰)我需要實現一個拷貝構造函數和一個賦值操作符。現在,我有一個全屏的代碼,只有一個類有3個字段(其中之一是緩衝區)。

一個問題。

我應該使用什麼? (我被選擇量所迷惑 - std::vector,std::array,std::shared_ptr,boost::scoped_ptr並且可能是別的東西)。

功能,這緩衝區,我所尋找的是:

  • 儘可能少的內存管理
  • 擺脫這些拷貝構造函數和賦值操作符的
  • 能力使用它爲void *(我必須將它傳遞給接受「void *」的函數)
  • 訪問隨機讀取/寫入的能力(我可能需要從中得到一個隨機範圍並向其中寫入一個隨機範圍)
  • 它分配在堆中(緩衝區可以相當大)
  • 最好的一些標準設備的使用
+0

你需要能夠複製或分配你的班級嗎? –

+4

在C++代碼中使用'malloc'和'free'幾乎總是一個bug。此外,你不能「擺脫這些拷貝構造函數和賦值操作符」。它們是C++的許多基本方面之一。如果你不想使用它們,不要使用C++。 –

+0

@KerrekSB是的。我想能夠複製我的課程。不過,我希望一些智能指針可以處理它。我希望他們分享指針和計數引用。但是,即使是直接複製內容也適用於我。 –

回答

4

您應該只使用std::vector<unsigned char>作爲緩衝區。這已經有了所有必要的構造函數,操作符和析構函數,所以除了使用它之外,沒有什麼特別的你需要做。

0

我不是一個C++高手,所以我歡迎任何批評該解決方案,但一個聰明的指向數組的指針可能工作。

#include <iostream> 
#include <memory> 


void do_something(void *buffer) 
{ 
    char* char_buffer = (char*)buffer; 
    std::cout << char_buffer[0] << std::endl; 
} 


int main() 
{ 
    size_t size = 10; 

    // reference counted pointer to auto-delete the buffer 
    std::shared_ptr<char> buffer(new char[size], std::default_delete<char[]>()); 

    // use the underlying pointer 
    // http://stackoverflow.com/questions/27819809/why-is-there-no-operator-for-stdshared-ptr 
    buffer.get()[0] = 'a'; 

    do_something(buffer.get()); 
    // buffer deallocated at the end of scope 
} 
  • 儘可能少的內存管理

智能指針需要照顧,對你

  • 擺脫這些拷貝構造函數和賦值操作符的

我認爲智能指針處理它們

  • 使用它爲void *的能力(我必須把它傳遞到接受 「無效*」 功能)

使用.get()和鑄造。

  • 訪問讀/它隨機寫入(我可能需要獲得一個隨機的範圍了出來,並寫一個隨機範圍的話)的能力

它仍然是一個指針,在本月底,所以我不明白爲什麼這不起作用(我沒有嘗試過)。

  • 分配它的堆(緩衝液可以是相當大的)

它是在堆上

  • 優選一些標準設施

<memory>

的使用

替代品y,checkout <vector>.data()函數,它返回一個指向矢量底層數組的指針。