std::shared_ptr<unsigned char[]> 构造时赋值一个字符串, 不适用memcpy
时间: 2024-01-20 09:02:11 浏览: 125
可以使用 `std::copy` 算法来代替 `memcpy`,如下所示:
```c++
#include <memory>
#include <algorithm>
int main() {
const char* str = "Hello, World!";
size_t len = std::strlen(str) + 1; // +1 for null terminator
std::shared_ptr<unsigned char[]> bytes(new unsigned char[len]);
// Copy the string into the buffer
std::copy(str, str + len, bytes.get());
return 0;
}
```
这里,我们使用 `std::copy` 算法将字符串复制到缓冲区中。与 `memcpy` 不同,`std::copy` 可以处理任何类型的对象,而不仅仅是 POD 类型。
相关问题
std::shared_ptr<unsigned char[]> 构造时赋值一个字符串
可以使用以下方式来构造一个包含字符串的 `shared_ptr<unsigned char[]>`:
```c++
#include <memory>
#include <cstring>
int main() {
const char* str = "Hello, World!";
size_t len = std::strlen(str) + 1; // +1 for null terminator
std::shared_ptr<unsigned char[]> bytes(new unsigned char[len]);
// Copy the string into the buffer
std::memcpy(bytes.get(), str, len);
return 0;
}
```
这里,我们使用 `std::strlen` 函数获取字符串的长度,并为缓冲区分配足够的空间(包括空终止符)。然后,我们使用 `std::memcpy` 函数将字符串复制到缓冲区中。最后,我们将 `bytes` 指定为 `shared_ptr<unsigned char[]>`,这将自动管理缓冲区的内存。
std::shared_ptr<unsigned char[]> 构造时赋值一个字符串, 不做任何拷贝
如果你想要构造一个 `std::shared_ptr` 对象,同时又希望该对象能够管理一个字符串的内存,可以考虑使用 `std::shared_ptr<unsigned char[]>`,并在构造时传入一个指向字符串的指针。代码示例如下:
```c++
#include <iostream>
#include <memory>
#include <cstring>
int main() {
const char* str = "hello world";
std::shared_ptr<unsigned char[]> ptr(reinterpret_cast<unsigned char*>(const_cast<char*>(str)), [](unsigned char* p) { delete[] p; });
std::cout << ptr.get() << std::endl;
return 0;
}
```
在这个示例中,我们将一个字符串常量 `const char* str` 的指针转换为 `unsigned char*` 类型,并将其传递给了 `std::shared_ptr<unsigned char[]>` 的构造函数。需要注意的是,我们必须使用一个 lambda 表达式作为析构器,以便正确地释放内存。这里我们使用了 `delete[]` 操作符,因为 `std::shared_ptr` 管理的是一个数组。
由于 `std::shared_ptr` 的默认删除器是 `delete`,所以如果你不提供一个自定义的删除器,它会尝试使用 `delete` 操作符来释放内存,这将导致编译错误,因为 `const char*` 类型的指针不能直接传递给 `delete` 操作符。
阅读全文