是否可以使用析构函数返回本地对象?

问题描述 投票:0回答:1

我有一个类[[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。这不是最好的方法,但这是我唯一的管理方法。 
c++ class operator-overloading heap lifetime
1个回答
0
投票
您需要实现引用计数,以避免重新分配动态资源。另外,您必须使用实现复制构造函数,因为从函数返回对象将调用复制构造函数,因此会增加引用计数。

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;} }

© www.soinside.com 2019 - 2024. All rights reserved.