2013-10-29 49 views
3

这可能是一个非常新手的问题。我的工作类(姑且称之为MyClass的)包括以下变量std ::复制动态分配的指针

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

自从我采取一个拷贝构造函数

MyClass(const MyClass& source) 

我需要复制source.bins。我打算使用algorithm中的std::copy,但我找到的所有示例均显示如何复制静态数组(如double bins[] = ...)或标准数据结构(如std::vector)。在double * bins = new double[nbins+i]等指针中找不到std::copy的任何示例。所以,我的问题是:是合法的指针上使用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

您可能希望使用'std :: vector '代替。 – milleniumbug

+0

我希望我可以使用矢量:)但我工作的框架不接受矢量。是的,我可以使用vector :: data()嘟m ... – Blackphoenix

回答

10

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

其中N是长度或通过source.bins数组指出。显然你必须确保你没有访问任何一个数组越界。

+0

谢谢,这是我的疑惑中最重要的。现在需要事先分配目的地吗?如果它被分配但是大小错误会发生什么?编辑:这两个问题已被回答。谢谢! – Blackphoenix

+0

@Blackphoenix我扩大了我的答案。如果分配的大小太小,则会出现未定义的行为。如果它太大,除了没有完全使用分配的内存外,没有关系。 – juanchopanza