gpt4 book ai didi

c++ - 我需要检查是否从 operator=? 抛出异常?

转载 作者:太空宇宙 更新时间:2023-11-04 12:46:52 25 4
gpt4 key购买 nike

给定以下代码:

template <class T>
class A {
T* arr;
int size;
public:
A(int size) : arr(new T[size]) , size(size) {
}
//..

A& operator=(const A& a){
if(this == &a){
return *this;
}
this->size = a.size;
T* ar=new T[a.size];
for(int i=0 ; i<size ; i++){
ar[i]=a.arr[i]; // I need to do it at "try-catch" ?
}
delete[] this->arr;
this->arr=ar;
return *this;
}
//...
};

当我从给定数组中复制元素时,是否需要使用 try-catch 子句来完成?这是个好主意吗?

最佳答案

我可以看到您的 T 拷贝可能会由于其自身的分配失败或其他原因而抛出。
另一方面,您的 A 拷贝可能已经抛出,因为它有分配失败。

目前您需要处理销毁,因为您还没有具体化您分配的数组,并且如果其中一个异常(可能是由于分配失败),您创建的所有 T 实例都需要销毁。

解决这个问题的一种快速方法是将数组保存在 unique_ptr 中。然后它将在退出上下文时被销毁。

另一种方法可能是在转让异常后重新考虑您在 A 上的契约(Contract):它必须是有效的,即在使用中继续存在,但也许它不需要保证仍然包含其以前的内容,也不需要保证所有新内容,所以你可以决定在分配和分配新数组之前销毁其现有数组,然后复制成员。如果大小没有改变,您可以决定不重新分配,而只是重新分配 - 这会在异常后留下一堆新旧成员,但它们都是有效的并且可以安全删除。

请确保大小始终与实际附加的数组大小相匹配!您现有的代码犯了这个错误,但特别是在删除之后和赋值之前将其设置为 null 和 0;并且只有在新指针赋值后才设置为新的新大小。

关于c++ - 我需要检查是否从 operator=? 抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51118178/

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