簡體   English   中英

將 shared_ptr 與 char* 一起使用

[英]Using shared_ptr with char*

我無法創建:

shared_ptr<char> n_char = make_shared<char>(new char[size_]{});

我該如何創建

char* chr = new char[size_]{}; 

使用現代指針?

shared_ptr n_char = make_shared(new char[size_]{});

make_shared在里面調用new ,所以你永遠不會同時使用兩者。 在這種情況下,您只調用new ,因為make_shared不適用於數組。

但是,您仍然需要讓它調用正確的刪除:

在 C++17 之前

您需要明確指定刪除器。

std::shared_ptr<char> ptr(new char[size_], std::default_delete<char[]>());

從 C++17 開始

shared_ptr獲得了類似於unique_ptr從一開始就已經擁有的數組支持:

std::shared_ptr<char[]> ptr(new char[size_]);

請注意,以這種簡單的方式完成后,您不會跟蹤長度並且在多線程環境中不會同步。 如果您需要可修改緩沖區,使共享指針指向std::string或其中包含std::stringstd::mutex的結構,將增加一個間接級別,但使用起來會更方便。

您可以使用專門用於數組的std::default_delete

std::shared_ptr<char> ptr(new char[size_], std::default_delete<char[]>());

std::default_delete 文檔 雖然 std::unique_ptr 在沒有指定其他刪除器時默認使用 default_delete 並且具有處理數組類型的部分特化:

std::unique_ptr<char[]> ptr(new char[size_]);

使用 std::shared_ptr 您需要通過將刪除器傳遞給構造函數來手動選擇它。

編輯:感謝 Jan Hudec, c++17 還包括對數組類型的部分特化

std::shared_ptr<char[]> ptr(new char[size_]);  // c++17

對於簡單的字符緩沖區:

std::shared_ptr<char> ptr( (char*)operator new( buffer_size_here ) );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM