나는

2012-06-08 2 views
4
예를 들어, 나는 내 자신의 vector를 작성하려고

? 내가 전에 그것을 새로운 포인터에 방어 적이기를 사용할 수 없습니다, 그래서 난 그냥 포인터 ptr 전에 새가이나는

template <typename T> 
void Vector<T> :: assign(T *start, T *end) 
{ 
    if (end - start > _capacity) 
    { 
     resize(end - start); 
    } 
    _size = end - start; 
    delete []ptr; 
    ptr = new T[_capacity]; 
    memcpy(ptr, start, end - start); 
} 

처럼 그 assign 함수를 작성 ,하지만 나는 포인터 사이에 무엇을 모두 복사 할 수 있습니까 startend

왜? 고맙습니다.

+2

'T'가 쉽게 복사 할 수있는 유형 인 경우에만 (읽음 : 아니오, 좋지 않음) – ildjarn

+0

@ildjarn 무엇을 의미합니까? – lpy

+0

[이 답변보기] (http://stackoverflow.com/a/7536230/636019). – ildjarn

답변

4

첫 번째 문제는 단순한 유형 (읽기 POD)에서만 작동한다는 것입니다.
생성자/소멸자가있는 모든 항목을 호출해야합니다.

두 번째로 예외는 아닙니다.
기본 보증을 제공하지 않기 때문에 혼자서도 강력한 보증을받을 수 있습니다.

개체를 수정하기 전에 모든 안전하지 않은 작업을 수행해야합니다. 즉 전에 new을 수행해야하며 전에 개체를 수정해야합니다. 그렇지 않으면 잠재적으로 개체를 잘못된 상태로 남겨 두는 것을 throw 할 수 있습니다 (나쁜 것처럼 보이지는 않지만 예외를 catch하고 릴리스 된 메모리에 대한 포인터를 포함하는 개체가 있으면 계속 진행할 수 있습니다).

따라서 std::copy()을 사용하더라도 여전히 잘못된 것을 수행했습니다.
개인적으로 std :: copy()의 제안은 빨간색 청어라고 생각합니다. 데이터를 올바르게 복사하지만 여전히 방법을 잘못 작성하고 있습니다. 사본에 꼬임을 사용하고 idium을 바꿔야합니다.

template <typename T> 
void Vector<T> :: assign(T *start, T *end) 
{ 
    Vector<T> tmp(start, end); // construct a temp object that allocates the memory. 



    swap(tmp);     // Swap the current object and the tmp objects data. 
           // When the tmp object goes out of scope it will delete 
           // what was the current objects data 

} 
3

이런 식으로 포인터를 다시 완벽하게 괜찮지 만, 그것은 당신이 어떤 종류의 T 모르기 때문에 여기 방어 적이기를 사용하는 안전하지 입니다. T가 문자열 또는 벡터와 같은 객체 유형이면 정의되지 않은 동작이 발생합니다.

는이 문제를 해결이 일의 안전, C++ 방법입니다

std::copy(start, end, ptr); 

에 줄을 변경합니다.

희망이 도움이됩니다.

+0

고마워요, 방금 사용하는 올바른 방법은'std :: copy (start, end, ptr);입니다. – lpy

+0

이것은 좋은 생각이 아닙니다. 예외 보장을 제공하지 않는'assign()'메소드는 여전히 남아 있기 때문에 깨진 답변입니다. –

+0

'std :: copy '에 대한 arg의 순서가 잘못되었습니다. 'std :: copy (ptr, start, end);가 아니라'std :: copy (start, end, ptr);가되어야합니다. C++ 11에서는'std :: copy_n (start, _size, ptr)'를 사용할 수 있습니다. – Nawaz