首页 > 解决方案 > 调整大小后将 unique_ptr char 数组复制到另一个 unique_ptr char 数组在 char 末尾缺少字母

问题描述

问题描述

在以下源代码中,我正在做以下事情:

源代码

#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 数组的末尾。

对不起,如果我屠杀了独特的指针。这是我的第一次尝试

标签: c++arraysresizeunique-ptr

解决方案


memcpy(newptr.get(), ptr.get(),strlen(ptr.get()));

这会复制所有内容,但不包括空终止符。

newptr[strlen(newptr.get())-1]= 'X';

strlen这使用非空终止(和部分未初始化)字符串调用。程序的行为是未定义的。

ptr.release(); //RELEASE POINTER

这会导致内存泄漏!


推荐阅读