我有一个类[[Foo],该类具有一个构造函数,该构造函数接收2个int并以2D形式在堆中创建一个动态数组,然后析构函数将其删除。问题是我正在创建一个将两个对象的两个值相加的函数operator +,并且在返回包含add的新对象时,它将调用析构函数,以使内部变量免费分配在堆中。
class foo()
{
foo() { }
foo(int a, int b){ ... } // Allocate 2D array
~foo() { ... } // Deallocate 2D array
void read() { ... }
void operator=(foo& A) { .. }
foo operator+(foo& A)
{
foo ans(2,2);
// Perform logic to add *this obj with A
...
return ans;
}
}
int main()
{
foo A(2,2), B(2,2);
foo C;
A.read();
B.read();
C = A + B;
return 0;
}
因此,当调用A + B时,所有操作都已完成,但是,当返回对象时,它将调用的析构函数并删除所有存储的信息。解决此问题的一种方法是通过将ans
pointer
返回到此“ ans”内存(分配它),但是问题是我不想在主函数中使用指针进行操作并存储它在堆中仅用于简单的引用是不好的。(我正在实际使用的另一种方式是通过创建operator + =
,因此int main中的代码如下所示: foo A(2,2), B(2,2);
A.read();
B.read();
C = A;
C += A;
通过此操作,我实际上是在修改C本身,并且以前将所有信息从A复制到C。这不是最好的方法,但这是我唯一的管理方法。
class foo_data{
public:
int nref=1;
int* pdata;
}
class foo()
{
foo_data* data;
foo() { data=new data;}
foo(const foo& o){
o->data->nref++; // increase ref
data = o.data; // copy all data from o to this
}
~foo(){
data->nref--;
if(data->nref==0) { delete data;}
}