为什么这个析构函数会影响我的代码和 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
或者,为了正确解决问题,了解三(和五)法则并应用它。
所以我创建了一个 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
或者,为了正确解决问题,了解三(和五)法则并应用它。