将 unique_ptr<std::vector> 与 C 风格数组结合使用

Use unique_ptr<std::vector> in combination with c-style arrays

问题

我有一个处理图像的旧代码库。 C++ 风格很旧(在 C++11 之前),没有智能指针或类似的东西。只有很多动态分配和原始指针。

始终只有一张实际图像经过处理。这些图像作为 c 样式数组保存和传递:

class A {
    A(double* image);
}

class B {
    B(){ image = new double[10]; };
    double* image;
} 

class C {
    C();
    foo(double* image);
}

我需要添加一个新的 class 来管理和读取图像。我想像这样设置一个 class,因为我对所有这些动态分配感到非常不舒服,并且想使用更现代的 C++。

class NewImage {
     NewImage();
     double* getImage() { return &image.get()->at(0); };
     readImage();
     ...
private:
     std::unique_ptr<vector<double>> image;
}
  1. 是否推荐有这样一个getImage()将图像交给老部分的功能?或者我应该使用 std::unique_ptr<double> image 之类的东西吗?
    • 如果我要使用 std::unique_ptr<double> image,我是否需要自定义删除器,因为 unique_ptr 管理一个数组,而不是指向 double 的指针?
  2. 或者我根本不应该使用现代 C++ 而坚持旧的风格吗?使用 double* image 和动态分配?

Is it recommended to have such a getImage() function for handing over the image to the old part?

如果你用过这样的功能,那没问题。一个更现代的替代方案可能是 return 一个 span,它封装了指向开头的指针以及数组的长度。

Or shouldn't I use modern C++ at all and stick to the old style? With double* image and dynamic allocation?

更新的设计仍然使用动态分配。它只是隐藏在 std::vector.

里面

请注意,std::vector 从一开始就在 C++ 标准中,并且在没有容器的情况下管理动态数组是非常古老的风格,早于标准 C++(现在已有二十多年的历史)和之前的 STL那。我不知道保持旧风格的好理由。


P.S。使用 std::unique_ptr 的附加间接寻址可能没有任何优势。将向量直接存储为成员可能更优化。