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

时间:2019-09-03 13:22:42

标签: c++ arrays unique-ptr class-design

问题

我有一个处理图像的旧代码库。 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管理一个数组,而不是一个指向double的指针?
  2. 或者我不应该完全使用现代C ++并坚持旧样式吗?使用double* image和动态分配吗?

1 个答案:

答案 0 :(得分:3)

  

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

如果已使用此功能,请确定。一种更现代的选择可能是返回一个span,它封装了指向数组开头和数组长度的指针。

  

或者我不应该完全使用现代C ++并坚持旧样式吗?拥有双*图像和动态分配?

较新的设计仍使用动态分配。它只是隐藏在std::vector内部。

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


P.S。使用std::unique_ptr的附加间接寻址可能没有优势。直接将向量作为成员存储可能是最佳选择。