C++指向对象删除的指针数组,"Debug assertion failure!"

C++ array of pointers to objects deletion, "Debug assertion failure!"

本文关键字:Debug assertion failure 数组 指针 对象 删除 C++      更新时间:2023-10-16

>我有一个容器类,其中包含指向对象的指针数组。这些对象中的每一个都包含另一个指向 int 的指针数组。但是,当尝试删除指向 int 的指针数组时,程序崩溃并给出"调试断言失败!"错误。

这是我的代码:

#include <iostream>  
using namespace std;
class number_group
{
private:
    int *integers;
public:
    number_group()
    {
        integers = new int [10];
    }
    ~number_group()
    { 
        delete [] integers; 
    }
};
class group
{
private:
    number_group *num;
    int n;
public:
    group()
    {
        n = 0;
        num = new number_group [10];
    }
    ~group()
    {
        delete [] num;
    }
    void add(number_group N)
    {
        if (n + 1 < 10)
        {
            num[n++] = N;
        }
        else
        {
            cout << "limit reached";
        }
    }
};
int main ()
{
    group First;
    number_group A;
    First.add(A);
    getchar();
    return 0;
}
您需要

为类组和number_group定义复制构造函数和复制赋值运算符。

错误的原因就在这两个语句中

number_group A;
First.add(A);

执行后,两个 number_group 类型的对象指向同一个数组:名称为 A 的对象和从 A 复制到函数 add 参数的临时对象。在语句末尾删除临时对象后First.add(A);对象 A 中的指针将无效。

下面是复制构造函数和复制赋值运算符的示例

number_group( const number_group &rhs )
{
    integers = new int [10];
    for ( int i = 0; i < 10; i++ ) integers[i] = rhs.integers[i];
}
number_group & operator =( const number_group &rhs )
{
    if ( this != &rhs )
    {
        int *tmp = new int [10];
        for ( int i = 0; i < 10; i++ ) tmp[i] = rhs.integers[i];
        delete []integers;
        integers = tmp;
    }
    return * this;
}

您按值传递number_group,但它不满足三法则。group也没有.