8

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

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

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

 MyClass( const MyClass& source )

我需要复制source.bins。我打算使用std::copyfrom 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) );

还是我应该依赖 Cmemcpy

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(or memcpy) 会解决这个问题?

4

1 回答 1

15

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

不,std::begin并且std::end要求数组是固定大小的。

2)在进行复制之前,我是否需要为目标分配内存?还是副本(或memcpy)负责?

您需要分配内存。两者都copy假设memcpy您为他们提供了一块可以写入的内存。

所以是的,您可以使用std::copy,但没有std::beginand std::end

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

其中N是 指向的长度或数组source.bins。显然,您必须确保您没有越界访问任何一个数组。

于 2013-10-29T16:52:27.750 回答