保留动态分配的数组而不为删除而烦恼的最佳方法

Best way for keeping dynamically allocated array without bothering about deletion?

本文关键字:烦恼 方法 最佳 删除 动态分配 数组 保留      更新时间:2023-10-16

这是我需要的:

class A
{
public:
    A()
        : ptr_(new char[1000])
    {}
    ~A()
    {
        delete [] ptr_;
    }
private:
    char* ptr_;
};

它的问题是 - 我必须编写复制构造函数,以及赋值运算符。我不想这样做,所以我使用shared_array:

class A
{
public:
    A()
        : array_(new char[1000])
    {}
private:
    boost::shared_array<char> array_;
};

这样做的问题是 - 我必须在所有地方使用 array_.get(),因为我需要指向缓冲区的 bore 指针。所以我还介绍了另一个指针:

class A
{
public:
    A()
        : array_(new char[1000])
        , bore_ptr_(array_.get())
    {}
private:
    boost::shared_array<char> array_;
    char* const bore_ptr_;
};

我的问题是 - 有没有更好的方法可以做到这一点?在最终解决方案中,我不喜欢的是 - 我保持shared_array,但我不使用它。它只是为了清洁东西。

看看unique_ptr或shared_ptr。对于智能指针来说,没有必要使用boost,因为C++11及更高版本都有自己的一套,可以很好地处理自己。

例如,您可以使用unique_ptr,它将为您提供所需的语法糖,因为您可以使用智能指针(唯一或共享),就像使用常规指针一样。因此,只需将shared_array换成其中任何一个。

如果你的类应该公开一个返回原始指针的函数,只需返回array_.get

const char* GetPtr() const
{
    return array_.get();
}

在类中,您始终可以使用此函数。或者,如果要改用bore_ptr_,则需要确保在智能指针更新的任何地方更新它。但是,我建议您不要仅仅为了键入更少的代码而使用另一个虚假变量。维护 borre-ptr 将来更容易出错,并且绝对不是有效数据类的一部分。

您也可以选择vectorunique_ptrshared_ptr。但逻辑将保持不变。

保留动态分配的数组而不用担心删除的最佳方法是使用std::vector<char>

class A {
  std::vector<char> array_;
  char* const bore_ptr_;
public:
  A() : array_(1000), bore_ptr_(array_.data()) {}
};