gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:05:46 28 4
gpt4 key购买 nike

这个问题可能有点愚蠢,但我对 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

编辑:一位 friend 建议改用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;

};

最佳答案

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

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

记住,当new被使用,那么 delete也必须使用。一般来说,你想调用deletenew 一样多的次数被调用了。


但是为什么要使用指针呢?在那种情况下,这似乎是多余的。如果您在没有充分理由的情况下使用指针,就会使您的代码容易出错。

这里有一些建议可供您选择,而不是使用指针(不需要您定义构造函数):

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

关于构造函数中的 C++ 二维数据数组 - 何时初始化和删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50606548/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com