1

我一直在创建一个类,它需要一堆图像并将它们叠加到一个 BMP 上。出于某种原因,在运行代码时我遇到了段错误,我已经将其追踪到了这个方法。本质上,if 语句检查图像数组中是否有一个有效的索引来放置这个新图像。如果它是有效的,那么它会删除以前存在的任何内容并将该索引设置为这个新图像。该类称为场景,由图像指针数组组成。所以我正在做的是替换其中一个指针指向的图像。不知何故,它不工作。如果指针为 NULL,则删除命令不会导致任何问题,所以我看不出有什么问题。此代码作用于具有长度为 5 的 Image 指针数组的场景。

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);
4

3 回答 3

4

在您的构造函数中,您有一个本地图像列表,但您在 addpicture 中使用了一个字段图像列表。您在构造函数中隐藏了 imagelist 字段,并且该字段永远不会被初始化。

通过替换此行来修复它:

Image** imagelist = new Image*[max];

有了这个:

imagelist = new Image*[max];
于 2010-02-09T02:10:44.197 回答
1

SEGFAULT 意味着您正在尝试访问您应该访问的位置之外的位置。在您对 Messa 的评论中,您说这是在delete命令中发生的。

所以,我问你:当你构造Scene类时,你是否明确地将指针初始化imagelist为 NULL?换句话说,是否有类似的行:

for (i=0; i<maxnum; i++) {
    imagelist[i] = NULL;
}

在您的构造函数中,还是假设未初始化的数组以 0 填充开始?(与大多数语言不同,这种假设在 C++ 中是不好的。)

于 2010-02-09T02:00:29.737 回答
0

这段代码看起来不错,我认为错误出在程序的其他部分。也许imagelist数组未初始化为NULL?或者maxnum不是实际大小imagelist。或者别的什么。

究竟是什么失败了——你有追溯吗?

于 2010-02-09T01:47:16.500 回答