2010-06-21 2 views
2

하나의 객체를 다른 객체에 할당하려고하면 프로그램이 중단되고 아무 문제가 있습니까?이 할당 연산자 오버로드에 어떤 문제가 있습니까?

Screen& operator=(Screen &scr) { 
    if (this != &scr){ 
    for (int i = 0; i < 50; i++) 
     fields[i] = NULL; 

    for (int i = 0; i < scr.numOfFields; i++) 
     fields[i] = scr.fields[i]; 

    numOfFields = scr.numOfFields; 
    currentField = scr.currentField; 
    } 

    return *this; 
} 
+0

당신이 줄이에 충돌 알고 있습니까? – Anthony

+1

전체 클래스 정의, 함수 프로토 타입 및 main()을 포함하여 컴파일 및 충돌을 포함한 완벽한 테스트 프로그램을 게시하십시오. 왜냐하면 나는 여러분의 코드의 모든 라인을 포함하는 테스트 프로그램을 작성했기 때문에 1) operator =에 인수를 추가하지 않고 컴파일하지 않고 멤버 함수로 만들고 2) 내가 한 후에 컴파일했다. 충돌없이 달렸다. –

+0

'필드 * '란 무엇입니까? 당신이 가리키는'Field' 객체를 소유하고 계십니까? 그렇지 않습니까? 그렇게하면 메모리 누수와 충돌이 발생합니다. 그렇지 않다면 괜찮아요.하지만 우리는 추측 할 수 없습니다. –

답변

0

당신은 당신의 동적 배열 대신 std::vector를 사용해야하고 나는 당신의 문제가 매우 빠르게 사라집니다 의심 :

Field *fields[50]; 
int numOfFields; 
int currentField; 

기능은 다음과 같습니다

변수입니다.

MadCap에서 제안한 것처럼 공유 포인터를 사용해야합니다.이 포인터는 컨테이너에 포인터를 사용할 때 가장 좋은 방법입니다. 또한 이것은 당신에게 당신이 기대하는 복사 의미를 줄 것이다.

이이에 대한 필요성 부정하는 것 :

for (int i = 0; i < 50; i++) 
     fields[i] = NULL; 

그리고 당신이 대체 할 수있는 : 성병 :: 사본

for (int i = 0; i < scr.numOfFields; i++) 
     fields[i] = scr.fields[i]; 

을, 뭔가 같은 :

fields.clear() 
std::copy(scr.fields.begin(), scr.fields.end(), fields.begin()); 

으로 이렇게하면 포인터 액세스 또는 초기화 오류로 인해 충돌이 발생할 가능성이 제거됩니다.

간단한 조언은 다음과 같습니다. 동적 배열 및 원시 포인터 사용을 중지하고 std::vectorboost::shared_ptr을 사용하는 대신 이러한 종류의 문제가 발생하는 것을 방지하는 데 도움이됩니다.

+0

아마도 사라지지 않을 것이지만 오류의 원인이 분명해질 수 있습니다. 여기서도 오류가 발생하지 않을 가능성이 있습니다. – wheaties

+0

나는'std :: copy'가 작동 할 것이라고 믿지 않습니다. 왜냐하면 여러분이 목적지'fields' 벡터에 실제 객체를 할당하지 않았기 때문입니다. 아마'std :: back_inserter'가 트릭을 할 것입니다. –

1

scr.numOfFields가 대상 객체의 필드 수를 초과하는 것이 하나의 문제 일 수 있습니다.

또 다른 문제는 적어도 새 개체에 포인터를 할당하고있는 것으로 보입니다. 즉, 프로그램에서 두 번 같은 위치에 대한 참조를 갖게됩니다. 한 지점에서 삭제되고 다른 지점에서 삭제되는 경우 어떻게됩니까? 메모리에 액세스하려고하면 seg 오류가 발생합니다.

당신은이를 방지하기 위해 자신의 공유 포인터를 사용할 수있는 부스트 한 경우 : http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/smart_ptr.htm

+0

Madcap의 첫 코멘트가 여기에 있습니다. 요소에 할당하려고하기 전에 scr이 필드 멤버와 동일한 크기인지 확인하지 않았습니다.여기에서해야 할 일은 필드에 할당 된 메모리 (동적으로 할당 된 경우 해당 하위 요소)를 삭제 한 다음 가져 오는 요소에 맞게 새 크기를 다시 할당하는 것입니다. 또한 할당 연산자 구문 맞다. 메모리 할당을 추적하는 것에 대해 걱정하지 않으려는 경우 radd가 제안한 std :: vector를 사용합니다. – twokats

관련 문제