如何初始化指向未知大小的常量数据的常量指针(需要分配)

How to initialize a const pointer to a const data of unknown size (need alloc)

本文关键字:常量 指针 分配 数据 未知 初始化      更新时间:2023-10-16

我有以下类:

class A {
    A(B* b, unsigned int size_in);
private:
    unsigned int size;
    // Pointer whose address and pointed-to data shouldn't be changed
    const char* const p1;
    // Pointer which should hold a copy of p1's data (at another location in the memory).
    // Shouldn't ever be changed once copied from p1
    const char* const p1_copy;
};

正在尝试了解如何构建构造函数,我想要此功能:

A::A(B* b, unsigned int size_in) :
  size(size_in), p1(b->GetPtr() + b->GetOffset())
{
  p1_copy = new char[size];
  memcpy(p1_copy, p1, size);
}

但我显然不能对p1_copy这样做,因为它是 const 并且只能在初始化列表中初始化(memcpy也不能将const指针作为第一个参数)。

仅供参考:执行构造函数后,我永远不会更改p1p1_copy

正确的方法是什么?

谢谢!

一种选择是创建一个函数来复制字符串:

char* copyString(const char* s, size_t size) {
    char* copy = new char[size];
    memcpy(copy, s, size);
    return copy;
}
A::A(B* b, unsigned int size_in) :
  size(size_in), p1(b->GetPtr() + b->GetOffset()),
  p1_copy(copyString(p1, size_in))
{
}

我更喜欢的另一种选择是仅使用 std::string 而不是原始指针:

class A {
    //...
    const std::string p1_copy;
};
A::A(B* b, unsigned int size_in) :
  size(size_in), p1(b->GetPtr() + b->GetOffset()),
  p1_copy(p1, p1 + size_in)
{
}
可能有一些

不同的解决方案,但这是const_cast设计的典型情况 - 您暂时想要覆盖某些东西的const性。

所以,你想要类似的东西(它可以在没有临时变量的情况下完成,但你需要更多const_cast操作,而且它不太清楚。

  char* tmp = new char[size];
  memcpy(tmp, p1, size);
  const_cast<const char*>(p1_copy) = tmp;

不确定这是否是正确/最好的方法,但你不能做类似的事情吗

const char* copy(const char* a, int size) {
    const char* ret = new char[size];
    memcpy(ret, a, size);
    return ret;
}

然后

A::A(B* b, unsigned int size_in) :
  size(size_in), p1(b->GetPtr() + b->GetOffset()), p1_copy(copy(p1, size)) {}