std::make_shared<char> 如何从一个char*构造并复制内存? 给出实现, 你必须回答
时间: 2024-02-09 20:07:56 浏览: 245
`std::make_shared` 不能直接从 `char*` 构造并复制内存,因为 `std::make_shared` 的模板参数必须是类型,而不是指针类型。
不过,你可以使用自定义 deleter 来实现从 `char*` 构造并复制内存。具体实现如下:
```cpp
#include <memory>
#include <cstring>
struct CharDeleter {
void operator()(char* p) const {
delete[] p;
}
};
std::shared_ptr<char> make_shared_char(char* str, size_t size) {
char* p = new char[size];
std::memcpy(p, str, size);
return std::shared_ptr<char>(p, CharDeleter());
}
```
使用时,可以这样调用:
```cpp
char* str = "hello";
std::shared_ptr<char> ptr = make_shared_char(str, std::strlen(str) + 1);
```
这样就可以从 `char*` 构造并复制内存,且内存会在 `std::shared_ptr` 引用计数为 0 时自动释放。
相关问题
std::shared_ptr<char>的使用
使用std::shared_ptr<char>可以通过不同的方式来进行初始化和操作。你可以使用std::make_shared来创建一个std::shared_ptr<char>对象,这样可以提高效率。比如,你可以这样使用std::make_shared来创建一个指向char类型的智能指针:
std::shared_ptr<char> p = std::make_shared<char>('a');
此外,你还可以使用std::shared_ptr的reset方法来重新指定指针的值。例如,你可以这样使用reset方法:
std::shared_ptr<char> p;
p.reset(new char('b'));
最后,使用std::shared_ptr时,你还可以通过封装make_shared_array方法来支持char数组的使用。这样你就可以创建一个指向char数组的智能指针。例如:
std::shared_ptr<char> p = make_shared_array<char>(10);
这些是使用std::shared_ptr<char>的一些常见操作和用法。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [《c++11学习笔记》 --- 智能指针(std::shared_ptr、std::uniq_ptr、std::weak_ptr)](https://blog.csdn.net/qq_41653875/article/details/121780253)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
std::shared_ptr<unsigned char> 构造时赋值
可以使用std::make_shared函数来创建和初始化一个std::shared_ptr对象,例如:
```
std::shared_ptr<unsigned char> ptr = std::make_shared<unsigned char>(42);
```
这将创建一个std::shared_ptr<unsigned char>对象,该对象包含一个值为42的unsigned char类型对象。如果需要分配一个数组,可以使用std::make_shared函数的另一个重载:
```
std::shared_ptr<unsigned char> ptr = std::make_shared<unsigned char[]>(10);
```
这将创建一个std::shared_ptr<unsigned char[]>对象,包含一个大小为10的unsigned char数组。
阅读全文