【发布时间】:2022-01-24 02:58:53
【问题描述】:
当我第一次学习 C++ 时,我避免使用 STL,因为我参与的项目并没有全部使用它(仍然不知道为什么)。
这就是我们的做法。
首先,我们有一个 memory 类,其中包含一个模板函数,如下所示:
/* ----------------------------------------------------------------------
create a 1d array
------------------------------------------------------------------------- */
template <typename TYPE> TYPE *create(TYPE *&array, int n, const char *name)
{
bigint nbytes = ((bigint) sizeof(TYPE)) * n;
array = (TYPE *) smalloc(nbytes, name);
return array;
}
在程序中创建数组时,我们只需这样做(例如,大小为 10 的一维双精度数组):
double *myArray;
memory->create(myArray, 10);
释放内存时,我们调用这个模板函数:
/* ----------------------------------------------------------------------
destroy a 1d array
------------------------------------------------------------------------- */
template <typename TYPE> void destroy(TYPE *&array)
{
sfree(array);
array = nullptr;
}
这样使用:
memory->destroy(myArray);
以这种方式制作数组而不是简单地做std::vector<double> myArray(10)有什么优点/缺点?
人们经常说我们应该使用std::vector,因为它可以防止内存泄漏......是这样吗?是因为有人可能忘记做memory->destroy(myArray)的唯一原因吗?
编辑:我不是在问std::vector 附带的特性/附件功能的好处,例如push_back 或sort。我想知道为什么有人会选择使用动态分配指针而不是 std::vector。
【问题讨论】:
-
要清楚 - 您是否要求列出
std::vector提供的所有功能的列表,这些功能不是由动态分配的 C 样式数组提供的? -
最好的情况?这个
memory类是由一个非常奇怪的特定嵌入式系统用例编写的,并且不知道std::allocator是一个东西。最坏的情况下?编写此代码的人是,我在这里使用技术术语,是一个白痴。这看起来像是盗版 C 风格的malloc,它放弃了所有类型安全性和敏感性,以消除 C++ 的好处。如果一个同事写了这个,问他们为什么,不要接受任何不完美的答案。如果你是一名学生,而老师给了你这个,那就找一个更好的老师,因为这是一场噩梦。 -
“这是唯一的原因,因为有人可能会忘记……” C++ 有例外。这意味着无论是否有人忘记手动释放内存,像您这样的内存解决方案都可能泄漏。您与
std::vector进行比较的内容与某人可能用 C 编写的内容非常相似。 -
@Thermodynamix 我试图为该类寻找析构函数,但甚至没有找到。毫无疑问,该类在非平凡的程序中使用是不安全的。因此,使用这样的类基本上是在泄漏内存的东西上签名。如果作者打算使用 C++,他们至少应该使用 C++ 习语。如果不打算复制该类,则禁用复制构造函数和赋值运算符。如果模板只能与 POD 类型一起使用,那么应该在编译时对它们进行检查,等等。
-
我当然没有时间这样做,但一个好的实验是使用
std::vector重写该代码并比较最终可执行文件的大小(启用优化后)。然后可以证明“代码膨胀”的理由是真还是假。如果std::vector的代码大小相似,那将非常有趣,而作者基本上是无缘无故地用那种 C 风格编写了所有这些代码。
标签: c++ arrays templates memory