a
问题是当t1
和t2
析构函数被调用
时你删除了两次相同的数组:t1
并且t2
它们的成员变量a
指向相同的内存位置。当您这样做时Test t2 = f(t1)
,会创建一个副本t1
并将其分配给t2
. 您没有定义特定的复制构造函数,因此编译器为您隐式定义了它。然而,它只是简单地复制了 的值a
(并且不会new
像您期望的那样进行分配)。
作为最佳实践,我建议添加您自己的:
- 复制构造函数
- 复制赋值
(cf rule of three
)
关于变量成员a
设计:
- 如果你想t1
和t2
指向同一个数组,那么你可以使用shared_ptr
- 如果你想t1
和t2
有自己的数组,那么使用vector<int>
for会更简单a
编辑:如果您需要使用原始指针,这里有一个快速示例,说明如何在复制构造函数和运算符分配中管理内存。我可以建议您阅读有关它的参考书(例如Effective C++ , chapter 11
)吗?它将向您解释关键概念和陷阱。
class Test{
public:
int number;
int *a;
Test(int n){
a = new int[n];
}
~Test(){
delete [] a;
}
Test(const Test& that)
{
int size = sizeof(that.a);
a = new int[size];
memcpy (a, that.a, sizeof(size));
}
Test& operator=(const Test& that)
{
if (this != &that)
{
delete [] a;
int size = sizeof(that.a);
a = new int[size];
memcpy (a, that.a, sizeof(size));
}
return *this;
}
};
Test f(Test Ft1){
//do something
return Ft1;
}
int main(){
Test t1(3);
t1.number = 5;
Test t2 = f(t1);
// Test t3(t1); // calls copy constructor
// t3 = t1; // calls assignment operator
return 0;
}