std :: copy用于动态分配的指针

时间:2013-10-29 16:49:21

标签: c++ arrays pointers copy

这可能是一个非常新手的问题。我正在处理的类(我们称之为MyClass)包含以下变量

 int nbins;
 double * bins; // = new double[nbins+i]

因为我正在实现一个复制构造函数

 MyClass( const MyClass& source )

我需要复制source.bins。我将使用std::copy中的algorithm,但我发现的所有示例都展示了如何复制像double bins[] = ...这样的静态数组或像std::vector这样的标准数据结构。我找不到像std::copy这样的指针使用double * bins = new double[nbins+i]的任何示例。所以,我的问题是:在指针上使用std::copy是合法的,例如

double * bins = new double[nbins+1]; //is this necessary?
std::copy( std::begin( source.bins ), std::end(source.bins), std::begin(bins) );

或者我应该更依赖C memcpy

double * bins = new double[nbins+1]; //again, is this necessary?
memcpy( source.bins, bins, (nbins+1) /* *sizeof(double) ?*/ );

所以,我的问题基本上是两个:

1)std::end(bins)知道bins (=new double[nbins+1])的结尾在哪里吗?

2)在复制之前,我是否需要为目的地分配内存?或copy(或memcpy)负责照顾?

1 个答案:

答案 0 :(得分:12)

  

1)std::end(bins)知道bins (=new double[nbins+1])的结尾在哪里吗?

不,std::beginstd::end要求数组具有固定大小。

  

2)在复制之前,我是否需要为目的地分配内存?或者副本(或memcpy)处理这个?

您需要分配内存。 copymemcpy都假设您为它们提供了可写入的内存块。

是的,你可以使用std::copy,但没有std::beginstd::end

double * bins = new double[nbins+1]; //is this necessary?
std::copy( source.bins , source.bins + N, bins );

其中Nsource.bins指向的长度或数组。显然你必须确保你没有访问任何数组越界。