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
的一生中存活下来。完美。
由于 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*
:
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
的一生中存活下来。完美。