c++ - 使 std::array 仅在数组的一部分上调用析构函数

标签 c++ c++11 stdarray

我正在使用 std::array 替换一些我正在升级到 C++ 的 C 代码中的“指针和计数”调用方法。创建和使用 std::array 没有问题,但在销毁时它将对所有元素调用析构函数。

但是我的数组经常不是完全满的,导致对空元素的析构函数调用。通常不是问题,因为它们将使用默认构造函数构造,但我只想通过递减大小计数来删除一个元素,这意味着在数组中留下一个“已使用”元素,这会导致销毁问题。

通过调用其元素的析构函数来确保仅销毁数组的一部分的最佳方法是什么?

对不起,我没说清楚。我创建了一个包含 std::array 和 size int 的类。

class MyArray {
  std::array< myclass, N > m_array;
  unsigned int             m_size;
};

显然,数组不会总是满的。我需要一个只会破坏 m_array 的第一个 m_size 元素的析构函数。

这行得通吗?

MyArray::~MyArray() {
  for (unsigned int s = 0; s < m_size; ++s) {
    m_array[s].~myclass();
  }
}

我担心的是析构函数在 myclass 上被调用了两次。

最佳答案

那是完全不可能的。 std::array 只是原始数组的包装器。数组没有“满”或“空”的概念。元素同样就在那里,它们不能被“移除”,它们会被破坏。

您正在与所选容器类型的主要特征作斗争。您必须恢复选择。必须有无数其他方法来实现您需要的行为,例如使用 std::vector

关于c++ - 使 std::array 仅在数组的一部分上调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35747345/

相关文章:

c++ - 堆叠推和弹出功能不起作用

c++ - std::accumulate 的第三个参数的充分理由?

c++ - 在 std::array 中使用时无法从 std::function 构造类

c++ - 用现代 C++ STL 数据结构替换旧的 C 风格数组

c++ - 我在解释 N4140 的§8.5.3/5 段中的要点 (5.2.1.1) 时遇到了一些困难

c++ - 为什么在打印消息时名称会打印两次?

c++ - 如何判断#define 是否有值

c++ - 在 move 构造过程中,从对象 move 的基本类型成员的值可以说些什么?

c++11 - 完美转发导致错误我不明白

c++ - 数组维度的变化导致 C++ 崩溃