【发布时间】:2015-01-30 14:13:59
【问题描述】:
我正在使用一个写得不好并且有很多内存泄漏的代码库。
它使用了很多包含原始指针的结构,主要用作动态数组。
虽然结构体经常在函数之间传递,但这些指针的分配和释放是随机放置的,不容易跟踪/推理/理解。
我将其中一些更改为类,并且这些指针将由类本身进行 RAIIed。它们运行良好,而且看起来并不难看,只是我禁止了这些类的复制构造和复制分配,只是因为我不想花时间实现它们。
现在我在想,我是不是在重新发明轮子?为什么不用 std:array 或 std::valarray 替换 C 样式的数组?
我更喜欢 std::valarray 因为它使用堆内存和 RAIIed。并且 std::array 在我的开发环境中(还)不可用。
Edit1:std::array 的另一个优点是这些动态数组中的大多数都是 POD(主要是 int16_t、int32_t 和 float)数组,而数值 API 可以让生活更轻松。
在开始之前我有什么需要注意的吗?
我能想到的一点是,可能没有一种简单的方法可以将 std::valarray 或 std::array 转换回 C 风格的数组,并且我们的部分代码确实使用了指针算法并且需要呈现数据作为普通的 C 样式数组。
还有什么?
编辑 2
我最近遇到了this question。 std::valarray 的一个非常糟糕的事情是它直到 C++11 才可以安全地复制分配。
正如该答案中所引用的,在 C++03 及更早版本中,如果源和目标的大小不同,则为 UB。
【问题讨论】:
-
除非我错过了它,否则我很惊讶
std::valarray没有像std::vector这样的.data()来在您需要C 样式数组时公开底层原始数组。 -
根据您的描述,似乎 std::vector 应该是合适的。有什么特别值得您考虑 std::valarray 的吗?
-
std::valarray是/曾经是用于 LAPACKish 应用程序的;它很少使用,可能不太适合这里。std::vector是动态数组的常用容器,您可以使用 C++11 之前的&vec[0]获取指向其数据的指针(当.data()尚不可用时)。 -
@nos std::valarray 的一个优点是它的数值 API 非常接近 numpy 和 matlab。而且我使用的大部分数组都是POD数组。
-
@Cyber:
valarray的目标之一是确保防止别名,这相当直接地转化为禁止访问任何指向实际数据的指针。