将 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;
}
- 是否推荐有这样一个
getImage()
将图像交给老部分的功能?或者我应该使用 std::unique_ptr<double> image
之类的东西吗?
- 如果我要使用
std::unique_ptr<double> image
,我是否需要自定义删除器,因为 unique_ptr 管理一个数组,而不是指向 double 的指针?
- 或者我根本不应该使用现代 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
的附加间接寻址可能没有任何优势。将向量直接存储为成员可能更优化。
问题
我有一个处理图像的旧代码库。 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;
}
- 是否推荐有这样一个
getImage()
将图像交给老部分的功能?或者我应该使用std::unique_ptr<double> image
之类的东西吗?- 如果我要使用
std::unique_ptr<double> image
,我是否需要自定义删除器,因为 unique_ptr 管理一个数组,而不是指向 double 的指针?
- 如果我要使用
- 或者我根本不应该使用现代 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
的附加间接寻址可能没有任何优势。将向量直接存储为成员可能更优化。