【问题标题】:C++ 2D data array in constructor - When to initialize and delete?构造函数中的 C++ 2D 数据数组 - 何时初始化和删除?
【发布时间】:2018-11-09 10:03:23
【问题描述】:

这个问题可能有点愚蠢,但我对 C++ 还是很陌生,而且距离我上次使用它已经有一段时间了。

我有一个名为 LEDBitmap 的类,它应该保存只有 1 和 0 的位图的宽度、高度和数据。

在头文件中我有以下结构:

struct MapData
{
  uint8_t width;
  uint8_t height;
  uint8_t[][] data;
};

以及下面的构造函数、析构函数和成员变量:

class LEDBitmap
{

  public:
    LEDBitmap(uint8_t width, uint8_t, height, uint8_t data[][]);
    LEDBitmap(uint8_t width, uint8_t, height);
    virtual ~LEDBitmap() {   };

  [...]

  private: //members
    MapData _map;
};

我现在想编写构造函数,可能还有析构函数,到目前为止,第一个构造函数有以下内容:

//initialize an empty bitmap with only zeros in it
LEDBitmap::LEDBitmap(uint8_t width, uint8_t, height) {
  _map.width = width;
  _map.height = height;
  _map.data = new uint8_t[width][height];
}

这个实现会起作用吗? (可能不是) 我应该麻烦实际实现析构函数吗?

编辑: 根据@gsamaras 的建议调整了我的代码。 _map以前是*_ptr

编辑:一位朋友建议改用calloc()。因此,我现在有:

LEDBitmap::LEDBitmap(uint8_t width, uint8_t height) {
  _map.width = width;
  _map.height = height;
  _map.data = calloc(width*height*(sizeof(uint8_t));
}

class LEDBitmap
{

  public:
    LEDBitmap(uint8_t width, uint8_t, height, uint8_t data[][]);
    LEDBitmap(uint8_t width, uint8_t, height);
    virtual ~LEDBitmap() {
      free(_map.data);
    };

  private: //members
    MapData _map;

};

【问题讨论】:

  • std::vector<uint8_t> 是你想要的。见:stackoverflow.com/questions/2151084/…
  • 我打算在微控制器上使用它,所以它应该非常轻量级
  • @gsamaras 没关系。
  • uint8_t[][] data; 这不是 C++。 Dows 它为你编译?
  • @n.m.我很想编译它,看看我做错了什么,但不幸的是,我有很多依赖它的东西,因为它是我已经为微控制器编码的东西的一部分,现在我不得不切换库。

标签: c++ arrays constructor destructor


【解决方案1】:

因为ptr 是一个指针,所以没有。您正在尝试填充结构的字段,甚至没有分配给它的内存。这会导致未定义的行为

  1. 您应该首先为结构分配内存,然后填充 它。
  2. 然后,在析构函数中,您必须取消分配该内存。

请记住,当使用new 时,还必须使用delete。通常,您希望调用delete 的次数与调用new 的次数完全相同。


但是为什么要使用指针呢?在这种情况下,这似乎是多余的。而且当你没有充分理由使用指针时,你的代码很容易出错。

以下是一些您可以选择的建议,而不是使用指针(不需要您定义构造函数):

  • 使用std::vector<uint8_t> 完成所有后台工作 (related), 正如 NathanOliver 所说。
  • 使用struct MapData 作为数据成员而不是指针。那 如果您希望重用该结构,那么在 OOP 编程中是有意义的 例如,由另一个班级。
  • 如果该结构仅用于此类,则考虑 直接为类提供结构的字段,作为其数据 成员,而不是结构本身。

【讨论】:

  • 不幸的是,我从未学习过如何在 C++ 中正确分配。我知道它必须完成,但总是混淆它何时以及如何发生。
  • 内存管理在 C++ 中很重要。您希望我在回答中包含一个示例吗?因为看起来 STL 让你担心微控制器(我不知道什么是最好的)。 @Lithimlin
  • 是的,那太棒了。
  • @Lithimlin 我可以这样做并继续我的一天,但现在我正在考虑它,它是不需要的。为什么需要使用指针,而不是结构本身作为类的数据成员?假设您不采用建议的矢量方法。
  • 另外,为什么要使用单独的 MapData 类型,而不是让这些成员成为 LEDBitmap 的一部分
猜你喜欢
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多