c++ - 如何调整属于某个类的唯一指针的 char 数组的大小。它必须在程序的整个生命周期中保持事件状态

标签 c++ arrays string char unique-ptr

我有一个名为容器的类,其中包含 std::unique_ptr _ptr。 这个_ptr必须在程序的整个过程中保持事件状态。我不能失去它。当最终容器对象被销毁时。它也会随之被毁灭。

在程序的某些部分。我需要向 _ptr 数组添加一个字符。为此,我使用以下函数:

void resizeUniquePtrArray(std::unique_ptr<char[]> &ptr) {
   std::unique_ptr<char[]> newptr(new char[strlen(ptr.get())+2]);
  memcpy(newptr.get(), ptr.get(),strlen(ptr.get()));
  newptr[strlen(newptr.get())]= 'X';
  newptr[strlen(newptr.get()) + 1]= '\0';
  ptr = std::move(newptr);
}

约束

我很确定我做错了什么。在我的项目中,有时我会丢失 _ptr 的内容,有时则不会。有趣的是 valgrind 没有发出警告。

  • 我不能使用字符串来代替 std::unique_ptr,因为我稍后必须在 const_cast 上使用它,这就像强奸我创建的字符串。

  • 我尝试使用 vector 并通过.data()将其分配给char *。但 Valgrind 发疯了,给我带来了各种读写错误

  • 问题在于 C 库及其 char* rawPointer。绕过去确实很难。我不能只使用新的字符。因为我必须随身携带它完成整个计划。

问题

Char 唯一指针数组 _ptr 的大小调整是否正确完成?

源代码

#include <iostream>
#include <string>
#include <memory> 
#include <string.h>

class Container {
    public:
     Container(const std::string &data):_data(data),_ptr(new char[data.size() + 1]) {}

     std::unique_ptr<char[]> & initPtr(){
         strcpy(_ptr.get(),_data.c_str());
         _ptr[strlen(_ptr.get()) + 1] = '\0';
         return _ptr;
     }
     private:
       std::unique_ptr<char[]> _ptr;
       std::string _data;
};

void resizeUniquePtrArray(std::unique_ptr<char[]> &ptr) {
   std::unique_ptr<char[]> newptr(new char[strlen(ptr.get())+2]);
  memcpy(newptr.get(), ptr.get(),strlen(ptr.get()));
  newptr[strlen(newptr.get())]= 'X';
  newptr[strlen(newptr.get()) + 1]= '\0';
  ptr = std::move(newptr);
}

int main()
{
  std::string name = "hello";
  Container c(name);
  std::unique_ptr<char[]> &ptr = c.initPtr();
  resizeUniquePtrArray(ptr);

  char* rawPointer = ptr.get();
  std::cout<< rawPointer << std::endl;

  //API LIBRARY CALL TO rawPointer it's a looonng process

  return 0;
}

最佳答案

I can't use a std::string instead of std::unique_ptr because i'll have to use later on const_cast it's like raping the string that I created.

不需要 const_cast 来获取指向底层 C 字符串的普通指针:

std::string s("abc");
char* p = &s[0];

或者,在 C++17 中:

char* q = s.data();

关于c++ - 如何调整属于某个类的唯一指针的 char 数组的大小。它必须在程序的整个生命周期中保持事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54389169/

相关文章:

c++ - Rapidjson 迭代并获取复杂 JSON 对象成员的值

c++ - 我如何使用 C++ 在 Linux 中制作托盘图标?

c# - 如何组合两个函数来删除文件

c - 将一个字符数组拆分为字符数组数组时,第一个数组始终显示为随机字符

c++ - C++ 中任意长度字符串的 strtoull

android - 在Android的OpenGL ES中运行时创建大型纹理的最有效方法

c++ - 识别 QT 中正则表达式匹配的组

php - php中如何计算两个不同长度数组的相似度百分比

java - 为什么通过 stream() 调用比使用 if 子句更耗时?

javascript - 如何根据任意对象值对数组进行排序?