c++ - 类成员中 T[n] 与 T* 样式数组的含义

标签 c++ memory containers

我正在为长期内存管理实现一个 super 简单的容器,该容器将包含在一个数组中。

我想知道,下面这两种方法的实际含义是什么?

template<class T, size_t C>
class Container
{
public:
   T objects[C];
};

和:
template<class T>
class Container
{
public:
  Container(size_t cap) 
  {
    this->objects = new T[cap];
  }
  ~Container() 
  {
    delete[] this->objects;
  }
  T* objects;
};

请记住,这些只是最小的例子,我没有考虑存储容量、虚拟大小等内容。

最佳答案

如果在编译时知道容器的大小,就像在第一个例子中一样,你最好使用 std::array .例如:

template<class T, size_t C>
class Container
{
public:
   std::array<T, C> objects;
};

这具有重要的优点:
  • 您可以通过 std::get 访问其元素,它会在编译时自动检查访问是否在范围内。
  • 您有 Container::objects 的迭代器,因此您可以使用 algorithm library 的所有例程.

  • 第二个例子有一些重要的缺点:
  • 访问元素时不能强制执行边界检查:这可能会导致错误。
  • 如果 new 会发生什么在构造函数中抛出?你必须妥善处理这个案子。
  • 您需要一个合适的复制构造函数和赋值运算符。
  • 您需要一个 virtual析构函数,除非您确定没有人从该类派生,请参阅 here .

  • 您可以通过使用 std::vector 来避免所有这些问题。 .

    关于c++ - 类成员中 T[n] 与 T* 样式数组的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59406838/

    相关文章:

    c++ - back_insert_iterator<> 按值传递安全吗?

    c++ - 我是否正确删除了我的结构?

    docker - 映射Bluemix容器上的暴露端口

    javafx - 如何使用 javaFX 拥有多个 SplitPanes(包括子项)?

    c++ - C++ 中集合/容器的接口(interface)/父类(super class)

    c++ - 使用指向成员函数的指针与使用开关的成本是多少?

    c++ - 我如何打印这些数字的其余部分?

    c++ - 找不到过程入口点 __gxx_personality_v0

    ios - Get-only 属性保留在内存中

    javascript - 将静态数据存储在图像而不是数组中是否有任何优势?