我的代码如下:
void Scene::copy(Scene const & source)
{
maxnum=source.maxnum;
imagelist = new Image*[maxnum];
for(int i=0; i<maxnum; i++)
{
if(source.imagelist[i] != NULL)
{
imagelist[i] = new Image;
imagelist[i]->xcoord = source.imagelist[i]->xcoord;
imagelist[i]->ycoord = source.imagelist[i]->ycoord;
(*imagelist[i])=(*source.imagelist[i]);
}
else
{
imagelist[i] = NULL;
}
}
}一点背景知识: Scene类有一个名为maxnum的私有int和一个在构造时动态分配的Image指针数组。这些指针指向图像。复制构造函数尝试对数组中的所有图像进行深度复制。不知怎么的,我得到了一个段错误,但我不知道我将如何访问超出界限的数组。
有没有人看到什么不对劲?
我是C++的新手,所以它可能是显而易见的。
谢谢,
发布于 2010-02-09 15:01:12
我建议maxnum (可能还有imagelist)成为私有数据成员并实现const getMaxnum()和setMaxnum()方法。但我怀疑这就是你所描述的任何段错误的原因。
我会尝试在引用之前删除常量,并实现常量公共方法来提取数据。它可能会编译,因为它只是一个引用。此外,我会尝试切换到指针,而不是通过引用传递。
或者,可以创建单独的Scene类对象,并将Image类型数据作为数组指针传递。我不认为你可以声明Image *imagelist[value];。
void Scene::copy(Image *sourceimagelist, int sourcemaxnum) {
maxnum=sourcemaxnum;
imagelist=new Image[maxnum];
//...
imagelist[i].xcoord = sourceimagelist[i].xcoord;
imagelist[i].ycoord = sourceimagelist[i].ycoord;
//...
}
//...
Scene a,b;
//...
b.Copy(a.imagelist,a.maxnum);发布于 2010-02-09 15:30:17
如果源Image的maxnum设置高于其imagelist中的实际项目数,则循环将超过source.imagelist数组的末尾。也许在数组开始为空时,maxnum被初始化为值1(或者maxnum可能根本不会被初始化),或者如果你有一个Scene::remove_image()函数,它可能已经删除了一个图像列表条目,而没有递减maxnum。我建议使用std::vector而不是原始数组。向量将跟踪它自己的大小,因此您的for循环将是:
for(int i=0; i<source.imagelist.size(); i++)并且它只能访问源向量中包含的所有项。崩溃的另一个可能的解释是,source.imagelist中的一个指针属于已删除的图像,但该指针从未设置为NULL,现在是一个悬空指针。
delete source.imagelist[4];
...
... // If source.imagelist[4] wasn't set to NULL or removed from the array,
... // then we'll have trouble later.
...
for(int i=0; i<maxnum; i++)
{
if (source.imagelist[i] != NULL) // This evaluates to true even when i == 4
{
// When i == 4, we're reading the xcoord member from an Image
// object that no longer exists.
imagelist[i]->xcoord = source.imagelist[i]->xcoord;最后一行将访问不应该访问的内存,可能对象仍然存在于内存中,因为它还没有被覆盖,或者它已经被覆盖,您将检索到无效的xcoord值。不过,如果你够幸运,那么你的程序就会崩溃。如果您直接处理new和delete,请确保在删除后将指针设置为NULL,这样就不会有悬空指针。但是,如果您在某个地方持有指针的副本,这并不能防止这个问题,在这种情况下,当您删除第一个副本并将其设为空时,第二个副本不会被设置为NULL。如果您稍后尝试访问指针的第二个副本,您将无法知道它不再指向有效的对象。
使用智能指针类并让它为您处理内存管理要安全得多。在标准C++库中有一个名为std::auto_ptr的智能指针,但它具有奇怪的语义,不能在std::vector等C++容器中使用。但是,如果您已经安装了Boost库,那么我建议您用boost::shared_ptr替换原始指针。
https://stackoverflow.com/questions/2226917
复制相似问题