将 unique_ptr<std::vector> 与 c 样式数组结合使用

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

本文关键字:样式 数组 结合 gt lt unique std vector ptr      更新时间:2023-10-16

>问题

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

始终只处理一个实际图像。这些图像作为 c 样式数组保留和传递:

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

我需要添加一个管理和读取图像的新类。我想建立一个这样的类,因为我对所有这些动态分配感到非常不舒服,并希望使用更现代的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管理一个数组,而不是指向双精度的指针?
  2. 还是我根本不应该使用现代C++并坚持旧风格?具有double* image和动态分配?

是否建议使用这样的 getImage(( 函数将图像移交给旧部分?

如果你有这样的功能,那么当然。更现代的替代方法是返回一个span,该封装指向数组开头的指针以及数组的长度。

还是我根本不应该使用现代C++并坚持旧风格?具有双*图像和动态分配?

动态分配仍用于较新的设计。它只是隐藏在std::vector里面.

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


附言使用std::unique_ptr的额外间接寻址可能没有优势。将向量直接存储为成员可能更理想。