2013-10-29 120 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