首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >构造函数中的C++二维数据数组-何时初始化和删除?

构造函数中的C++二维数据数组-何时初始化和删除?
EN

Stack Overflow用户
提问于 2018-05-30 13:55:22
回答 1查看 112关注 0票数 2

这个问题可能有点愚蠢,但我对C++还是相当陌生的,我已经有一段时间没有用它做过什么了。

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

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

代码语言:javascript
运行
复制
struct MapData
{
  uint8_t width;
  uint8_t height;
  uint8_t[][] data;
};

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

代码语言:javascript
运行
复制
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;
};

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

代码语言:javascript
运行
复制
//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()代替。因此,我现在有:

代码语言:javascript
运行
复制
LEDBitmap::LEDBitmap(uint8_t width, uint8_t height) {
  _map.width = width;
  _map.height = height;
  _map.data = calloc(width*height*(sizeof(uint8_t));
}

代码语言:javascript
运行
复制
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;

};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-30 13:59:45

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

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

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

但为什么要用指针呢?在那种情况下似乎是多余的。当您使用指针而没有好的理由时,您的代码就容易出错。

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

  • std::vector<uint8_t>所述,使用related来完成所有的工作。
  • 使用struct MapData作为数据成员而不是指针。这在OOP编程中是有意义的,例如,如果您希望另一个类重用该结构。
  • 如果结构只打算从这个类中使用,那么考虑直接将结构的字段作为它的数据成员,而不是结构本身。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50606548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档