-1

例如,如果我有一个游戏,我想要在屏幕上弹跳点,假设点在构建时被放入列表中并且渲染和移动被处理,我是否可以在不制作浅拷贝的情况下在 main 中执行此操作。

int main()
{ 
    for(int i = 0; i < 10; i++)
    {
        Dot * temp = new Dot();
    }

    while(!quit)
    {    
        //Handle the dot rendering and movement
    }
}

我问这个是因为我确实做了一些非常相似的事情,每当我试图删除列表中的点时,如果它们相互碰撞,在一个点被删除并且我试图删除另一个点之后,我得到了一个分段错误。提前致谢!

4

2 回答 2

1

@Ernest 是对的,分段错误不是由于复制构造函数,而是由于您尝试访问/删除您无法访问的内存位置。这意味着您正在使用的指针指向错误的内存地址,这可能是因为您已经删除了它。

复制构造函数无法查看对象是否是“新的”。无论如何,如果您不实现一个哑复制构造函数,通常会生成一个(自动生成默认/复制/移动 ctor 和复制/移动赋值运算符的条件?)。

“哑”的意思是,该类将无法自动复制使用新创建的所有类实例,例如,或更一般地,指向的元素。

析构函数在作用域的末尾被调用,或者当你对“new”对象(动态分配的内存)调用“delete”操作符时。同样,大多数 c++ 编译器都会自动实现哑析构函数。

“哑”的意思是,该类不会自动删除使用“新”创建的所有变量。

检查完整性:什么是三法则?

于 2013-03-17T21:43:25.753 回答
1

听起来您之前的问题是双重删除。如果Dot有一个析构函数,并且在该析构函数中删除了一个或多个指向成员对象的指针,那么您肯定需要一个复制构造函数。默认的复制构造函数会留下两个Dot指向相同对象的指针,然后当两个Dots 都被删除时,子指针将被删除两次。这当然是非法的,并且经常导致段错误。您需要提供一个复制构造函数,为每个对象提供Dot自己的子对象,因此不会发生双重删除。

于 2013-03-17T21:30:10.640 回答