在以下源代码中,我正在执行以下操作:
使用“ Hello”创建字符串名称
创建一个大小为name.size()+ 1个大小的unique_ptr ptr char数组
将字符串存储到ptr数组
添加以空字符结尾的字符
创建一个大小为strlen(ptr.get())+2
将memcpy ptr转换为newptr
发布ptr
添加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数组的末尾。
对不起,如果我杀了唯一指针。这是我的第一次尝试
答案 0 :(得分:1)
memcpy(newptr.get(), ptr.get(),strlen(ptr.get()));
这将复制所有内容,但不包括空终止符。
newptr[strlen(newptr.get())-1]= 'X';
这将使用非空终止(且部分未初始化)的字符串调用strlen
。该程序的行为是不确定的。
ptr.release(); //RELEASE POINTER
这会导致内存泄漏!