다음 코드를 감안할 때 스텝 오버 해시 [tmpSet] = 폴리 라인, 복사 생성자 내의 p.start는 NULL입니다. 그런 다음 p.start가 그 안에 이상한 값을 설정하면 두 번째로 호출됩니다.C++ 복사 생성자 이상한 행동
실마리가 무엇입니까?
감사합니다, 에리히
편집 1 : 그것을 고정 다항식 클래스에 할당 연산자를 추가하는 생각,하지만하지 않았다. 여전히 같은 문제가 있습니다.
다음 코드를 감안할 때 스텝 오버 해시 [tmpSet] = 폴리 라인, 복사 생성자 내의 p.start는 NULL입니다. 그런 다음 p.start가 그 안에 이상한 값을 설정하면 두 번째로 호출됩니다.C++ 복사 생성자 이상한 행동
실마리가 무엇입니까?
감사합니다, 에리히
편집 1 : 그것을 고정 다항식 클래스에 할당 연산자를 추가하는 생각,하지만하지 않았다. 여전히 같은 문제가 있습니다.
당신은 Rule of Three 위반됩니다
당신이 과부하 때문에 복사 생성자을, 당신은 당신의 클래스에 대한 해야하는 과부하 복사 할당 연산자 및 소멸자.
위의 문은 코드 예제에서, 당신은 해야으로 해야를 대체 할 수있는 일반적인 시나리오를 참조했다.
"필수"가 너무 강합니다. "해야한다"는 것이 더 적절합니다. –
@ 올리 찰스 워스 :이 경우에는 반드시 **해야합니다 **는 맞습니다 :) –
@Als : 매우 사실! 어쨌든, +1. –
초기화를 초기화하는 기본 생성자를 NULL에 추가해야합니다.
위의 편집을 참조하십시오. –
두 가지 문제가 있습니다.
1) 인수가없는 생성자가 없으므로 컴파일러는 초기 값을 적합하다고 신고합니다. p.start가 처음에 NULL 인 것은
입니다. 2) 복사 생성자가 p.start == NULL
을 사용하여 polynomial
을 전달하면 클래스의 변수를 초기화하지 않으므로 다음 복사본에 컴파일러의 초기 값을 지정할 수 있습니다 할당 (문제 # 1 참조).
수정하려면 다항식을 제너럴 상태로 초기화하는 인수없는 생성자를 추가해야합니다. 그런 다음 복사 생성자가 이러한 다항식을 전달하면 자체를 정상 상태로 초기화해야합니다.
위의 편집을 참조하십시오. –
두 번째 점은 여전히 의미합니다. 빈 다항식을 복사 생성자에 전달하면'p.start'가 NULL임을 알 수 있습니다. 그런 다음'this-> start'를 NULL로 설정하지 않습니다 (기본 생성자는 복사 생성자 중에 실행되지 않습니다). –
Als가 지적했듯이, 당신은 3의 규칙을 위반합니다. 글쎄, 컨테이너에 물건을 넣을 때 포인터에 어떤 일이 생기는지.
monomial *start;
monomial *next;
이것에 대해 생각하십시오.
위의 편집을 참조하십시오. –
복사 생성자는 p.start == NULL 인 경우 시작 값을 임의의 값으로 설정합니다. 이는 프로그램의 다른 코드에 따라 문제의 원인 일 수 있습니다. 또한 할당 연산자가 없으므로 컴파일러에서 얕은 복사본을 처리합니다. 다른 함수를 추가해야합니다. polynomial &operator=(const polynomial& b)
위의 편집을 참조하십시오. –
p.start가 null 인 경우 대입 연산자를 수정했지만 여전히 기본값은 아닙니다. 'if (p.start!= NULL) {'else {start = NULL;}'로 끝나야합니다. (음, 할당 연산자에서 먼저 할당 해제하는 것을 잊지 마세요.) –
글쎄요, 내가 틀렸거나 뭔가 있습니다. 제발 바보라고 부르지 마세요. 내부 포인터가있는 해시 컨테이너 객체를 넣습니다. 컨테이너에 객체를 넣으면 복사가됩니다 (귀하의 경우 포인터 주소 만). 프로그램이 범위를 벗어나면 포인터를 몇 번 파괴하려고 시도합니다. 그래서 거기에 참조 카운트 또는 어떤 포인터가 있어야합니다. 내가 틀렸다면 수정하십시오. – legion
감사합니다. 나는 else 문을 추가했으며 현재 작동 중입니다. 이 문제가 왜 수정되었는지 조금 더 설명해 주시겠습니까? 또한, "대입 연산자 우선 할당 해제"란 무엇을 의미합니까? –