我正在开发图形库,目前正在进行优化。据我所知(如果我错了,请纠正我),在GCC / G ++编译器中,只读变量和常量放在flash的文本部分(我正在使用基于ARM处理器的嵌入式系统)和这提供了一种有效的方法来保存大块数据而不是依赖于RAM。
因此,我需要初始化一个类中声明的const数组,这是我的方法:
#include <iostream>
using namespace std;
class BITMAP{
public:
const uint16_t *BMP; // Image for this graphic object
BITMAP(uint16_t *bmp) : BMP(bmp) {} // This is where I initialize the const array
};
class GFX{
public:
void init_bmp();
void render();
private:
// Object
BITMAP *bmp_image;
};
void GFX::init_bmp()
{
cout << "Setting..." << endl;
uint16_t *BMP1 = new uint16_t[2];
BMP1[0] = 0xFFFF;
BMP1[1] = 0xFFFF;
BITMAP bmp_image(BMP1);
cout << "done!" << endl;
delete[] BMP1;
}
void GFX::render()
{
for( int i=0; i<2; i++ )
{
cout << i << ":" << bmp_image->BMP[i] << endl;
}
}
int main()
{
GFX img;
img.test();
img.render();
return 0;
}
每当我尝试阅读BITMAP::BMP
的内容时,上面的代码就会给我一个分段错误。在上面的代码中初始化const uint16_t *BMP
的正确方法是什么?
答案 0 :(得分:1)
有两个问题:bmp_image
永远不会被初始化,并且在读取之前会删除它。
而不是:
BITMAP bmp_image(BMP1);
这样做:
bmp_image = new BITMAP(BMP1);
这些指针应该在每个类的析构函数中删除,而不是之前。
此外,您实际上并未创建常量数组。您正在动态创建数组,因为您使用new
。使其成为文本部分中的编译时常量的一种方法是使用图像创建一个全局数组:
static const uint16_t BMP1[] = {0xFFFF, 0xFFFF};
然后将此数组传递给BITMAP
的构造函数。
答案 1 :(得分:0)
在上述代码中初始化
const uint16_t *BMP
的正确方法是什么?
您正在正确初始化它。问题是你delete
分配了内存,这使得成员指针成为悬空指针。
您可以删除该行
delete[] BMP1;
要解决这个问题。但是,管理动态分配的内存充满了问题。更喜欢使用std::vector
。