矢量分配和内存使用

时间:2014-10-29 13:16:11

标签: c++ c++98

在数学语境中,我有一个包含实数向量的类。这个向量可能非常大,或者不是。它取决于用户。我看到两种分配内存的方法,但我无法选择。您如何看待这两种解决方案?

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;
}

使用第一个解决方案,我只使用所需的内存,但是在分配失败的情况下我放松了内容。使用第二种解决方案,我的向量在分配失败的情况下不会改变,但是我使用了很多内存,而在每次分配时都不需要。

在数学语境中这样做的常用方法是什么?还有其他方法可以做到这一点我错过了吗?也许更好的解决方案是保留两个解决方案并让用户选择?

1 个答案:

答案 0 :(得分:1)

问题是如果你能处理异常。如果您可以处理异常并继续该程序,则应选择第二个,因为您可以在异常后恢复,并且您可能需要数据。如果你不能,那么这是第一个最有效的。

但是你的代码非常令人困惑。就像分配后不需要以前的数据一样。 (大多数时候你将数据复制到新分配的内存中)如果你的意图始终是第一个,那么如果你承担丢失以前数据的风险,那么这意味着你不会无论如何都需要它。