将 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);
}
我需要添加一个管理和读取图像的新类。我想建立一个这样的类,因为我对所有这些动态分配感到非常不舒服,并希望使用更现代的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管理一个数组,而不是指向双精度的指针?
- 如果我使用
- 还是我根本不应该使用现代C++并坚持旧风格?具有
double* image
和动态分配?
是否建议使用这样的 getImage(( 函数将图像移交给旧部分?
如果你有这样的功能,那么当然。更现代的替代方法是返回一个span
,该封装指向数组开头的指针以及数组的长度。
还是我根本不应该使用现代C++并坚持旧风格?具有双*图像和动态分配?
动态分配仍用于较新的设计。它只是隐藏在std::vector
里面.
请注意,std::vector
从一开始就在C++标准中,在没有容器的情况下管理动态数组是非常古老的风格,早于标准C++(现在已经有二十多年的历史了(和在此之前的 STL。我不知道坚持旧风格的好理由。
附言使用std::unique_ptr
的额外间接寻址可能没有优势。将向量直接存储为成员可能更理想。
相关文章:
- 将包含C样式数组的对象初始化为成员变量(C++)
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- 如何在谷歌模拟中匹配 C 样式数组
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- 解压缩 C 样式数组以及C++中的参数包
- 复制 C 样式数组和结构
- C++中循环和 C 样式数组的范围工作
- C++ - 移动具有固定大小的 c 样式数组成员的类的构造函数
- std::array与C样式数组用于连续内存
- 从原始指针(衰减的 C 样式数组)和大小生成范围::视图
- 不要声明 C 样式数组,而是使用 std::array<>
- 带C++的 C 样式数组?
- 如何从嵌套的 std::initializer_list 初始化 2D C 样式数组?
- 将 unique_ptr<std::vector> 与 c 样式数组结合使用
- 为什么我不能将 C 样式数组复制到 std::array?
- 函数需要 C 样式数组
- 键入 trait 以获取 std::array 或 C 样式数组的元素类型
- 何时需要删除 C 样式数组
- C++ C 样式数组作为语法错误的参数