这个问题可能有点愚蠢,但我对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;
};发布于 2018-05-30 13:59:45
因为ptr是一个指针,所以没有。您正在尝试填充结构的字段,该结构甚至没有分配给它的内存。这会导致未定义的行为。
记住,当使用new时,也必须使用delete。通常,您希望调用delete的次数与调用new的次数相同。
但为什么要用指针呢?在那种情况下似乎是多余的。当您使用指针而没有好的理由时,您的代码就容易出错。
以下是您可以从中挑选的一些建议,而不是使用指针(这不需要定义构造函数):
std::vector<uint8_t>所述,使用related来完成所有的工作。struct MapData作为数据成员而不是指针。这在OOP编程中是有意义的,例如,如果您希望另一个类重用该结构。https://stackoverflow.com/questions/50606548
复制相似问题