我一直在创建一个类,它需要一堆图像并将它们叠加到一个BMP上。由于某些原因,在运行代码时我遇到了段错误,我已将其跟踪到此方法。本质上,if语句检查图像数组中是否有一个有效索引来放置这个新图像。如果它有效则删除之前的任何内容并将该索引设置为这个新图像。 Class被称为Scene,由一组Image指针组成。所以我正在做的是替换其中一个指针指向的图像。不知何故它不起作用。如果指针为NULL,则删除命令不应该导致任何问题,所以我看不出会出现什么问题。此代码作用于具有长度为5的图像指针数组的场景。
void Scene::addpicture(const char* FileName, int index, int x, int y)
{
if (index<0 || index>maxnum-1)
{
cout << "index out of bounds" << endl;
}
else
{
Image* extra;
extra = new Image;
extra->ReadFromFile(FileName);
delete imagelist[index];
imagelist[index] = extra;
imagelist[index]->xcoord=x;
imagelist[index]->ycoord=y;
}
}
任何人都可以提供帮助。非常感谢。
由于
我已编辑过包含构造函数:
Scene::Scene(int max)
{
Image** imagelist = new Image*[max];
for(int i=0; i<max; i++)
{imagelist[i] = NULL;}
maxnum = max;
}
我还注释掉了main方法,以便调用的唯一函数是
Scene* set = new Scene(5);
set->addpicture("in_01.bmp", 0, 0, 0);
答案 0 :(得分:4)
在构造函数中,您有一个本地图像列表,但您在addpicture中使用了一个字段图像列表。您正在构造函数中隐藏imagelist字段,并且该字段永远不会被初始化。
通过替换此行来修复它:
Image** imagelist = new Image*[max];
有了这个:
imagelist = new Image*[max];
答案 1 :(得分:1)
SEGFAULT表示您尝试访问的位置超出了应有的位置。在你对Messa的评论中,你说它发生在delete
命令。
所以,我问你:当你构造Scene
类时,你是否显式将imagelist
中的指针初始化为NULL?换句话说,是否有如下行:
for (i=0; i<maxnum; i++) {
imagelist[i] = NULL;
}
在你的构造函数中,或者你假设未初始化的数组以0填充开始? (与大多数语言不同,这种假设在C ++中很糟糕。)
答案 2 :(得分:0)
这段代码看起来不错,我认为错误在程序的其他部分。也许imagelist
数组未初始化为NULL
?或maxnum
不是imagelist
的实际尺寸。或者别的什么。
究竟什么是失败的 - 你有追溯吗?