删除数组指针堆损坏 [英] delete array pointers heap corruption

查看:74
本文介绍了删除数组指针堆损坏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Visual Studio 2015的这一行上遇到了一个异常.它的构建没有错误.

I get an exception on this line in Visual Studio 2015. It builds with no errors.

_free_dbg(block, _UNKNOWN_BLOCK);

这就是我声明新的指针数组的方式:

This is how I declare the new array of pointers:

CAirship * pAirShip[10];

这是我删除 pAirShip 指针数组的方式:

This is how I delete the array of pAirShip pointers:

for (int i = 0; i < 10; i++) {
            if (pAirShip[i]) {
            cout << "pAirShip[" << i << "] is " << pAirShip[i] << endl;
            delete pAirShip[i];// Delete appropriate object
    }
        } // end for loop

我在尝试删除pAirShip [0] 时遇到错误,

这是一个调试窗口,它确实打印了指针地址:

Here is a debug window that does print the pointer addresses:

这是完整的代码:

struct AirShipFile {
    int Type;  // Airplane or Balloon
    string name;        // Name of the airship
    int passCount;      // passenger count
    int weightCargo;     // cargo weight
    int EngOrGas;       // engine or gas type
    int distance;       // range or altitude
};
enum EngineType { Jet, Propeller }; // for airplanes only
std::ostream& operator<<(std::ostream& out, const EngineType value) {
static std::map<EngineType, std::string> strings;
if (strings.size() == 0) {
#define INSERT_ELEMENT(p) strings[p] = #p
    INSERT_ELEMENT(Jet);
    INSERT_ELEMENT(Propeller);
#undef INSERT_ELEMENT
    }

return out << strings[value];
}
enum GasType {Helium, Hydrogen };  // for proprellers only
std::ostream& operator<<(std::ostream& out, const GasType value) {
static std::map<GasType, std::string> strings;
if (strings.size() == 0) {
#define INSERT_ELEMENT(p) strings[p] = #p
    INSERT_ELEMENT(Helium);
    INSERT_ELEMENT(Hydrogen);
#undef INSERT_ELEMENT
    }

return out << strings[value];
}
enum AirShipType { AIRPLANE, BALLOON };
class CAirship {
public:
CAirship() { }
virtual void SetData(AirShipFile &data) = 0;
virtual void GetData() = 0;
AirShipType GetAirShipType() { return m_AirShipType; }

protected:
AirShipType m_AirShipType;

};

class CAIRPLANE : public virtual CAirship {
public:
CAIRPLANE() : CAirship() {}
void SetData(AirShipFile &data);
void GetData();

private:
EngineType m_EngineType;
int m_MaxPassengerCount;
string m_Name;
int m_MaxCargoWeight;
int m_MaxAltitude;
};
// Function: SetData
void CAIRPLANE::SetData(AirShipFile &data)
{
// cast integer to enum
m_EngineType = EngineType(data.EngOrGas);
// airplane name
m_Name = data.name;
// passenger count
m_MaxPassengerCount = data.passCount;
//max cargo weight
m_MaxCargoWeight = data.weightCargo;
// cast integer to enum
m_AirShipType = AirShipType(data.Type);
// maximum altitude
m_MaxAltitude = data.distance;

}
void CAIRPLANE::GetData()
{
cout << setw(20) << m_Name << "\t" << setw(20) << m_EngineType << setw(20);
cout << left << setw(20) << m_MaxAltitude << "\n";
}
class CBALLOON : public virtual CAirship {
public:
CBALLOON() : CAirship() {}
void SetData(AirShipFile &data);
void GetData();

private:
GasType m_GasType;
EngineType m_EngineType;
int m_MaxPassengerCount;
string m_Name ;
int m_MaxCargoWeight;
int m_MaxAltitude;
};
void CBALLOON::SetData(AirShipFile &data)
{
// cast integer to enum
m_GasType = GasType(data.EngOrGas);
// airplane name
m_Name  = data.name;
// passenger count
m_MaxPassengerCount = data.passCount;
//max cargo weight
m_MaxCargoWeight = data.weightCargo;
// cast integer to enum
m_AirShipType = AirShipType(data.Type);
// maximum altitude
m_MaxAltitude = data.distance;
}
void CBALLOON::GetData()
{
cout << setw(20) << m_Name << "\t" << setw(20)<< m_GasType << setw(20);
cout << left << setw(20) << m_MaxAltitude << "\n";
}
// AIRPLANE = 0
// BALLOON = 1
int main(int argc, char *argv[])
{
if (argc != 2) {
    cout << "Usage: PR <filename>\n";
    return 1;
}
ifstream Infile(argv[1]);
if (!Infile) {
    cout << "Cannot open file\n";
    return 1;
}
char LineBuf[100];
char d[] = ",";
CAirship * pAirShip[10];
int i = 0;
while (Infile.getline(LineBuf, 100)) {
    struct AirShipFile data;
    // read the first field Airship type
    // airplane or balloon
    data.Type = atoi(strtok(LineBuf, d));
    switch (data.Type) {
    case AIRPLANE:
        // Create AIRPLANE Object
        pAirShip[i] = new CAIRPLANE();
        data.name = strtok(NULL, d);
        data.passCount = atoi(strtok(NULL, d));
        data.weightCargo = atoi(strtok(NULL, d));
        data.EngOrGas = atoi(strtok(NULL, d));
        data.distance = atoi(strtok(NULL, d));
        break;
    case BALLOON:
        // Create BALLOON Object
        pAirShip[i] = new CBALLOON();
        data.name = strtok(NULL, d);
        data.passCount = atoi(strtok(NULL, d));
        data.weightCargo = atoi(strtok(NULL, d));
        data.EngOrGas = atoi(strtok(NULL, d));
        data.distance = atoi(strtok(NULL, d));
        break;
    default:
        break;
    } // end switch
      // call appropriate function
    pAirShip[i++]->SetData(data);
    memset(LineBuf, '\0', 100);
    }
    Infile.close();
    cout << "Listing of all Airplanes \n";
    cout << left << setw(20) << "\nName" << left<< setw(20)<<"\tEngine     Type";
    cout << left<<setw(20)<<"\Maximum Range" << "\n\n";
    for (int i = 0; i < 10; i++) {
    if (pAirShip[i]->GetAirShipType() == AIRPLANE)

        pAirShip[i]->GetData();
    }
    cout << "\n\nListing of all Balloons \n";
    cout <<left << setw(20) << "\nName" << left << setw(20) << "\tGas Type" ;
    cout << left << setw(20) << "\Maximum Altitude" << "\n\n";
    for (int i = 0; i < 10; i++) {
    if (pAirShip[i]->GetAirShipType() == BALLOON)
        pAirShip[i]->GetData();
    }

for (int i = 0; i < 10; i++) {
    if (pAirShip[i]) {

        delete pAirShip[i];// Delete appropriate object
        }
} // end for loop

return 0;
}

推荐答案

问题是,当分配任何类型的数组时,C ++不会初始化元素,而是为它们保留随机"值.因此,当您创建一个指针数组时,不会使用 NULL nullptr 0 值创建指针,所以这不是一个好方法指示它们是否真的没有被单独使用.尝试释放未分配的空间是产生错误的原因.创建数组后,应首先使用 nullptr 初始化它们(在 for 循环中自己进行),然后可以使用代码删除指针数组.

The problem is that when allocating an array of any kind, C++ does not initialize the elements, but leaves them with "random" values. So, when you create an array of pointers, the pointers are not created with NULL, nullptr or 0 value, so this is not a good indicator if they are really unused on its own. Trying to free the space that isn't allocated is what generates the error. You should first initialize them (by yourself in a for loop) with nullptr right after you create the array, then you can use your code for deleting the array of pointers.

这篇关于删除数组指针堆损坏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆