在数学语境中,我有一个包含实数向量的类。这个向量可能非常大,或者不是。它取决于用户。我看到两种分配内存的方法,但我无法选择。您如何看待这两种解决方案?
template <typename T>
T* new_array<T>(unsigned long int size) throw(AllocationFailure);
class MyVector
{
private:
unsigned long int datasize;
double* data;
public:
// other member functions
void allocate1(unsigned long int size);
void allocate2(unsigned long int size);
};
void MyVector::allocate1(unsigned long int size)
{
delete [] this->data;
this->data = 0;
this->datasize = 0;
try { this->data = new_array<double>(size); }
catch(const AllocationFailure& e){ throw AllocationFailure(std::string("Impossible to allocate the vector : ") + e.what()); }
this->datasize = size;
}
void MyVector::allocate2(unsigned long int size)
{
double* new_data = 0;
try { new_data = new_array<double>(size); }
catch(const AllocationFailure& e){ throw AllocationFailure(std::string("Impossible to allocate the vector : ") + e.what()); }
delete [] this->data;
this->data = new_data;
this->datasize = size;
}
使用第一个解决方案,我只使用所需的内存,但是在分配失败的情况下我放松了内容。使用第二种解决方案,我的向量在分配失败的情况下不会改变,但是我使用了很多内存,而在每次分配时都不需要。
在数学语境中这样做的常用方法是什么?还有其他方法可以做到这一点我错过了吗?也许更好的解决方案是保留两个解决方案并让用户选择?
答案 0 :(得分:1)
问题是如果你能处理异常。如果您可以处理异常并继续该程序,则应选择第二个,因为您可以在异常后恢复,并且您可能需要数据。如果你不能,那么这是第一个最有效的。
但是你的代码非常令人困惑。就像分配后不需要以前的数据一样。 (大多数时候你将数据复制到新分配的内存中)如果你的意图始终是第一个,那么如果你承担丢失以前数据的风险,那么这意味着你不会无论如何都需要它。