Constructor/Destructor 通过值或引用调用时未调用函数。有什么办法吗?

Constructor/Destructor function not being called while calling by value or reference. Any way around it?

由于 c++ 的一个特性,我遇到了麻烦。使用动态内存分配后,由于显而易见的原因,我总是清除堆(空闲存储)。我用析构函数来做。有时,使用构造函数分配内存。但是在从另一个函数调用一个对象(按值调用)之后,只有析构函数起作用。我知道在很多情况下这是一个很好的特性。但是,在使用大量独立功能时会很烦人。有什么办法吗,伙计们?或者,我应该只使用成员函数来分配和清除内存吗?

一个例子:

#include <iostream>
using namespace std;

class test{
int *a;
public:
test(int x) {a=new int;
             *a=x;}
int geta(){return *a;}
 ~test(){delete a;}
};

int apow2(test t)
{
return ((t.geta())*(t.geta()));
}

int main()
{
test tst(10);
cout<<"\nA^2="<<apow2(tst);
//at this point, memory reference to 'a' doesn't exist
cout<<"\n"<<tst.geta();
return 0;
}

您遇到问题是因为您没有为 class 实现 复制构造函数 复制赋值运算符 test: you did not abide by the rule of three.

但是,好消息!你不需要。您可以通过存储 int 而不是 int*:

来避免 all 这种混乱
class test
{
   int a;

public:
   test(int x)
     : a{x}
   {}
};

就是这样!没有动态分配,没有内存管理,什么都没有。只是 test,还有一个 int 可以保证在 test 的生命周期内存活。完美。

如果您出于问题中未说明的原因需要动态分配(哎呀),那么您应该使用智能指针为您管理其生命周期:

class test
{
   std::unique_ptr<int> a;

public:
   test(int x)
     : a{new int(x)}
   {}

   int geta() { return *a; }
};

就是这样!没有内存管理,什么都没有。只是 test,还有一个 int*,其指点对象肯定会在 test 的一生中存活下来。完美。