为什么这个析构函数会影响我的代码和 class 对象,但没有它一切正常?

Why this destructor affect my code and class objects but without it all work fine?

所以我创建了一个 class 以及 2 个构造函数、一个打印函数和一个析构函数。 我尝试创建 2 个具有不同值的对象,但在析构函数方面遇到了一些问题。

我写了 2 个构造函数,所以我可以用 2 种不同的方式创建对象: 像这样

myclass o1;
o1=myclass(..parameters..)

或者像这样

myclass o1(..parametters..)

当我 运行 包含析构函数的代码时,我的第一个对象 o1 没有正确创建,在某些情况下,当我创建对象 o2 后,第一个对象更改了它的参数值并获得与第二个相同的元素。

奇怪的是,当我删除析构函数 (~myclass) 时,代码运行正常。

此外,我注意到当我使用像 o2 这样的带参数的构造函数创建 o1 时,它再次正常工作。

为什么会这样,我该如何解决? (对不起,我的英语不好)。 这是代码:

#include <iostream>
using namespace std;
class myclass{
private:
    int a;
    int *b;


public:
    myclass()
    {
        a=0;
        b=NULL;
    }
    myclass(int vect[100], int m){
        int i;
        a=m;
        b=new int[a+1];
        for(i=1;i<=m;++i)
            b[i]=vect[i];

    }

    void print()
    {
        int i;
        for(i=1;i<=a;i++)
        cout << b[i] << " ";
        cout << '\n';

    }
    ~myclass()
    {
        delete[] b;
    }
};

int main()
{
    int i,vect[100],n;
    cin >> n;
    for(i=1;i<=n;++i)
        cin >> vect[i];
    myclass o1;
    o1=myclass(vect,n);

    o1.print();

    cin >> n;
    for(i=1;i<=n;++i)
        cin >> vect[i];
    myclass o2(vect,n);

    o1.print();

    return 0;
}

这是我的输入:

4
5 6 7 8
6
10 11 12 13 14 15

我的输出:

12058816 6 7 8

10 11 12 13

您遇到的主要问题是:

myclass o1;
o1=myclass(vect,n);

由于您的 class 不遵守三规则(或五规则),因此在创建临时文件时,它共享 int *b;。然后,当删除临时文件时,您的 b 成员将被删除。

从这里开始,您可以使用:

myclass o1(vect,n); // no temporaries, less issues

或者,为了正确解决问题,了解三(和五)法则并应用它。