【问题标题】:Why use dynamic arrays/pointers instead of std::vector? [closed]为什么使用动态数组/指针而不是 std::vector? [关闭]
【发布时间】: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&lt;double&gt; myArray(10)有什么优点/缺点?

人们经常说我们应该使用std::vector,因为它可以防止内存泄漏......是这样吗?是因为有人可能忘记做memory-&gt;destroy(myArray)的唯一原因吗?

编辑:我不是在问std::vector 附带的特性/附件功能的好处,例如push_backsort。我想知道为什么有人会选择使用动态分配指针而不是 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


【解决方案1】:

最常见的是,这是因为代码早于 STL 的存在。它甚至可能最初是在某个时候迁移到 C++ 的 C 代码。

使用现代编译器,没有理由重新实现 STL 标准库类。对于任何新编写的代码,这样做基本上没有优点,而且有很多缺点。

【讨论】:

    猜你喜欢
    • 2020-12-04
    • 2015-12-15
    • 2011-08-03
    • 1970-01-01
    • 2014-02-17
    • 2011-09-17
    • 2021-02-24
    • 2014-03-06
    • 1970-01-01
    相关资源
    最近更新 更多