c++ - 调整大小后将 unique_ptr char 数组复制到另一个 unique_ptr char 数组在 char 末尾缺少字母
问题描述
问题描述
在以下源代码中,我正在做以下事情:
用“Hello”创建一个字符串名称
创建一个大小为 name.size() + 1 大小的 unique_ptr ptr char 数组
memcpy 字符串到 ptr 数组
添加以空字符结尾的字符
创建一个大小为 strlen(ptr.get()) +2 的 unique_ptr newptr char 数组
memcpy ptr 到 newptr
释放指针
将 X 添加到你好
添加以空字符结尾的字符
源代码
#include <iostream>
#include <string>
#include <memory>
#include <string.h>
int main()
{
std::string name = "hello";
std::unique_ptr<char[]> ptr(new char[name.size()+1]);
memcpy(ptr.get(),name.c_str(),name.size());
ptr[name.size()] ='\0';
std::unique_ptr<char[]> newptr(new char[strlen(ptr.get())+2]);
memcpy(newptr.get(), ptr.get(),strlen(ptr.get()));
newptr[strlen(newptr.get())-1]= 'X';
newptr[strlen(newptr.get())]= '\0';
ptr.release(); //RELEASE POINTER
char* c = newptr.get();
std::cout<< c << std::endl;
return 0;
}
输出
预期的输出应该是:helloX
但我只得到地狱
我不知道为什么它不起作用。我不明白为什么字符 X 没有被添加到 newPtr char 数组的末尾。
对不起,如果我屠杀了独特的指针。这是我的第一次尝试
解决方案
memcpy(newptr.get(), ptr.get(),strlen(ptr.get()));
这会复制所有内容,但不包括空终止符。
newptr[strlen(newptr.get())-1]= 'X';
strlen
这使用非空终止(和部分未初始化)字符串调用。程序的行为是未定义的。
ptr.release(); //RELEASE POINTER
这会导致内存泄漏!
推荐阅读
- html - 带有图像的容器具有奇怪的高度
- lua - 没有显示错误时如何修复我的战斗脚本?
- swift - 为什么文本字段委托不能以编程方式在文本字段上使用设置文本?
- java - 如何使用 Eclipse 的数据工具平台设置登录超时?
- java - 听 Java 记录器
- arrays - Racket FFI——C 数组 (_array) 用法示例?
- firebase - 如何在 Flutter 中基于 Future 结果构建 Stream?
- git - Github 多个存储库默认使用旧用户名
- javascript - 盖茨比:在 facebook 上分享 -> 图片太小
- javascript - Javascript“多维数组”(即数组的数组)的奇怪问题