2013-10-29 2 views
3

이것은 아마도 매우 초보자 질문입니다. 내가 일하고 있어요 클래스는 내가 복사 생성자 나는 source.bins을 복사해야동적으로 할당 된 포인터에 대한 std :: copy

MyClass(const MyClass& source) 

을 구현하고 있습니다 때문에 다음과 같은 변수

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

포함 (의가 MyClass에 전화하자). 을 algorithm에서 사용하려고했지만, 찾은 모든 예는 double bins[] = ...과 같은 정적 배열을 복사하거나 std::vector과 같은 표준 데이터 구조를 복사하는 방법을 보여줍니다. std::copydouble * bins = new double[nbins+i]과 같은 포인터에 사용되는 예는 찾을 수 없습니다. 그래서, 내 질문은 : 예

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

에 대한 같은 포인터에 std::copy를 사용하는 법적 또는 차라리 의존해야 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()를 사용하면 엉망입니다. – Blackphoenix

답변

10

) 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

관련 문제