0

好的,所以我将我的代码简化到最低限度,以便发布的列表不会很长。问题是当我完成程序时代码崩溃,即调用了析构函数。因为点类在 ptlist 类中,而板类中的 ptlist 我认为我必须在删除析构函数中的对象时进行一些链接,但是在我到达 if(item != NULL) 行后它崩溃了ptlist 的析构函数...由于某种原因,它既不输入 if 子句也不输入 else 子句.. 不知道为什么.. 无论如何,这是我程序的精简代码:

[编辑] 感谢大家,我修复了代码,它现在运行完美。谢谢你们

#include <windows.h>  //include all the basics
#include <tchar.h>    //string and other mapping macros
#include <string>
#include <ctime>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
using namespace std;

class point
{
    unsigned x;
    unsigned y;
    int id;
    int type;
    bool covered;
    int maze;

public:
    point(){x = 0; y = 0; id = 0; type = -1; covered = true; maze = 0;}
    ~point(){x = 0; y = 0; id = 0; type = 0; covered = true; maze = 0;}
};

class ptlist
{
    point ** item;
    int length;
    int itemmax;

public:
    ptlist(){item = NULL; length = 0; itemmax = 0;}
    ptlist(int imax);
    ~ptlist();
};

ptlist::ptlist(int imax)
{
    item = new point *[imax];
    length = 0;
    itemmax = imax;
}

ptlist::~ptlist()
{
    delete [] item;
}

class board
{
    ptlist *wall;
    ptlist *path;

public:
    board(){wall = new ptlist(1); path = new ptlist(1);}
    ~board(){delete wall; delete path;}
};
4

3 回答 3

0

除了混淆delete和delete[]之外,你不需要循环删除new[]分配的数组的所有元素。运算符 delete[] 为您执行此操作。见#5.3.5(6)。您正在执行重复释放,这将导致未定义的行为。

于 2013-07-13T07:05:11.027 回答
0

你在delete[]不应该使用的地方使用。

wall = new ptlist(1);
delete wall; // NOT delete [] wall

path.

规则是当您分配一个数组(使用new [])时,您使用 解除分配delete[]。当您与new您一起分配时,您将与delete.

此外,您正在创建指向点的指针数组或指向点的数组数组。无论如何,您永远不会初始化这些指针,而是delete稍后初始化它们。您至少应该在NULL构造函数中将它们初始化为:

ptlist::ptlist(int imax)
{
    item = new point *[imax];
    for( int i = 0; i<imax; ++i )
        item[i] = NULL;
    length = 0;
    itemmax = imax;
}

如果它们是数组而不是单个点,您应该delete []在析构函数中删除它们。

于 2013-07-13T06:36:57.633 回答
0

你的逻辑~ptlist()显然是错误的。delete item当您知道itemis时,您正在调用NULL。您应该删除该else子句。

此外,您的构造函数ptlist(int max)永远不会为每个指针创建一个点数组。

于 2013-07-13T06:30:12.520 回答