gpt4 book ai didi

c++ - 运算符重载 : memory leaks

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:56:31 25 4
gpt4 key购买 nike

这是我无法理解的事情。假设我重载运算符 & 以在两个对象之间创建 and 和 operator = 以进行赋值(创建对象的拷贝)。假设我有一个名为 A 的类,并且这段代码:

A a1,a2,a3;
// initialize a1,a2,a3
a1=a2&a3;

如果a1已经分配了,当我将a1分配给a2&a3时,会出现内存泄漏?是否在不删除旧对象的情况下创建了新对象?

PS:运算符重载使用两个类型 A 的参数(我没有定义类 A,这是一个例子),返回类型 A 的参数,定义为类的友元。

代码:

这是一段很长的代码,所以我使用了 pastebin: http://pastebin.com/42TnThfC但由于篇幅较长,我也贴出最重要的部分:

template<class T>
List<T>& List<T>::operator= (List<T>& l)
{
List<T>* ptr=l.next;
if(this!=&l)
{
resize(0);
while(!ptr->end)
{
push(ptr->info);
ptr=ptr->next;
}
}
return *this;
}

template <class T>
List<T>& operator& (List<T>& l1, List<T>& l2) throw()
{
List<T>* temp,*ptr=l1.next;
temp=new List<T>();
try
{
if( (l1.end)^(l2.end) )
throw excp1;
}
catch (char *s)
{
cout << "Exception: "<<s<<endl;
}
if(l1.end)
{
while(!ptr->end)
{
if(l2.in(ptr->info))
temp->push(ptr->info);
ptr=ptr->next;
}
}
else
{
if(l1.info==l2.info)
temp->push(l1.info);
}
return *temp;
}

是一个列表,push推送一个item,main的一个例子:

int main(int arcg, char **argv)
{
List<T>l1,l2,l3;
for(int i=0;i<10;i++)
{
l1.push(i);
l2.push(i);
l3.push(i);
}
l3=l1&l2;
}

这种情况下l3已经是l1&l2了,但是会不会造成内存泄露?

最佳答案

不,应该没问题。原来的a1将被销毁并替换为一个新的(这是a2 & a3的结果)。

但是您应该确保,如果 A 包含指针,则为该类型正确定义了复制构造函数、赋值运算符和析构函数,否则“原始 a1 将被销毁"可能还不够!

关于c++ - 运算符重载 : memory leaks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9055345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com