使用"删除"运算符清理内存时出现"调试断言失败"错误

'Debug Assertion Failed' Error when cleaning memory using 'delete' operator

本文关键字:调试 断言 失败 错误 内存 运算符 删除 使用      更新时间:2023-10-16

我已经尝试了所有方法,但代码不工作,我不明白为什么。

我有两个类。这个是基类:

class Vegetables
{
    private:
        char *nameStr;
        char *countrySrc;
        int seasonRd;
    public:
        Vegetables()
        {
            cout << "Default constructor for Vegetables" << endl;
            nameStr = new char[20];
            nameStr = "Unknown";
            countrySrc = new char[20];
            countrySrc = "Unknown";
            seasonRd = -1;
        }
        virtual ~Vegetables()
        {
            delete[]nameStr; //Here happens the error (_crtisvalidheappointer(block))
            delete[]countrySrc;
            cout << "Destructor for Vegetables" << endl;
        }
};

继承了"inherited Unit"类:

class InhUnit : public Vegetables
{
    private:
        Delivery delivery_;
        Vegetables vegetables;
        int quantity;
        int price;
        int delivPrice;
    public:
        InhUnit() :Vegetables(),delivery_(OwnCosts), vegetables(), quantity(-1), price(-1), delivPrice(-1)
        {
            cout << "Default constructor for Inherited Unit" << endl;
        }
        ~InhUnit()
        {
            cout << "Destructor for Inherited Unit" << endl;
        }
};

弹出这个错误的原因是什么?

这不是你复制字符串的方式,使用strcpy代替

    Vegetables()
    {
        cout << "Default constructor for Vegetables" << endl;
        nameStr = new char[20];
        strcpy(nameStr, "Unknown");
        countrySrc = new char[20];
        strcpy(countrySrc, "Unknown");
        seasonRd = -1;
    }

你所做的是分配一些内存并将其分配给指针。然后在下一行,您将指针赋值给指向字符串的指针,而不是将字符串复制到您分配的内存中。

当你调用delete[]时,因为指针没有指向你分配的内存,你得到了一个错误。

您应该使用像std::string这样的字符串类来避免指针问题。

修改代码

class Vegetables {
private:
    std::string nameStr;    // Use std::string instead of C-style string
    std::string countrySrc;
    int         seasonRd;
public:
    // Use constructor initialization list
    Vegetables() : nameStr("Unknown"), countrySrc("Unknown"), seasonRd(-1) {
        cout << "Default constructor for Vegetables" << endl;
    }
    virtual ~Vegetables() {
        cout << "Destructor for Vegetables" << endl;
    }
};