调整大小后将unique_ptr char数组复制到另一个unique_ptr char数组到char末尾缺少字母

时间:2019-01-24 19:28:16

标签: c++ arrays resize unique-ptr

问题描述

在以下源代码中,我正在执行以下操作:

  • 使用“ Hello”创建字符串名称

  • 创建一个大小为name.size()+ 1个大小的unique_ptr ptr char数组

  • 将字符串存储到ptr数组

  • 添加以空字符结尾的字符

  • 创建一个大小为strlen(ptr.get())+2

  • 的unique_ptr newptr char数组
  • 将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数组的末尾。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

ptr.release(); //RELEASE POINTER

这会导致内存泄漏!