1

비슷한 질문이 많지만 아직 도움이되는 내용을 찾지 못했습니다. 나는 지금이 시간 동안 몇 시간 동안 있었고 그것은 나를 미치게 만들었다. 복사 생성자에 의해 생성 된 변수에 대해 소멸자가 호출되면 세그먼트 화 오류가 발생합니다.소멸자가 세분화 오류를 일으킬 수 있음

//Copy Constructor 
Stack::Stack(const Stack &aStack) 
{ 
    size = 0; //this is incremented as new items are pushed onto the stack. 
    cap= aStack.cap; 
    items = new int[aStack.cap](); 
    for (int i = 0; i < aStack.size; i++) 
     this->push(aStack.items[i]); //Adds an item if not full and increments size 
     // I have also tried: items[i] = aStack.items[i] 
} 

//Destructor 
Stack::~Stack() 
{ 
    cap= 0; 
    size= 0; 
    delete [] items; 
    items = NULL; 
} 

는 내가 복사 생성자의 잘못을하고 있어요 느낌을 얻을 수 있지만, 나는 그것이 무엇인지 알아낼 수 없습니다.

+4

상위 요소 대신 크기를 반복해야합니까? 스택에는 일반적으로 인덱서 블 요소가 있습니까? – chris

+0

그리고'top'은 복사 생성자의 새 객체에 설정되지 않습니다. – syam

+0

잠깐, 왜'top'이 함수가 아닌가? (만약'size'도 없으면 같은 것을 주장 할 것이다.)? – chris

답변

0

라인 :

for (int i = 0; i < aStack.top; i++) 

가 있어야한다 :

for (int i = 0; i < aStack.size; i++) 

그것은 당신이 가능성이 범위 인덱스 또는 뭔가 비슷한 (정의되지 않은 동작 영토)의 부족에 액세스하려고하기 때문에 독방 감금 오류있는가이다.

+0

그저 단순하다면 나는 그것을 잡을 수 있습니다 : P 이름이 약간 정확하지 않습니다 (그것에 대해 아무 것도 할 수 없으며 선생님이 선택했습니다). "Top"은 스택의 최상위 요소 위에있는 인덱스, 즉 크기이고 "size"는 용량입니다 ("maxSize"라고 생각하십시오). 따라서, top은 이미 할당 된 모든 요소를 ​​반복합니다. 의견을 보내 주셔서 감사합니다. D – Atrus

+0

원래 질문을 편집하여 이름이 더 명확합니다. – Atrus

+0

아이템은 어떤 타입입니까? 그것은 int *로 선언되고 있습니까? – Ozraptor

1

글쎄, 나는 그것을 발견했다. 나는 내가 여기있는 바보처럼 누구에게나 놓을 것이다. (기본적인 C++ 지식이 부족하다.) 그래서 나는 똑같은 것을 찾기 위해 시간을 들일 필요가 없다.

내 문제는 소멸자가 "선택적으로"작업하는 것 같았습니다. 일부 테스트에서는 작동했지만 다른 테스트에서는 실패했습니다. 몇 시간 동안의 테스트를 비교 한 후에 마침내 그것을 발견했습니다.

실패한 테스트는 pop 함수를 테스트하여 완료되고 스택이 비어있을 때까지 계속됩니다. 내 소멸자에서 가, 때마다 팝업 항목을 제거 내 팝업 기능을하는 방식으로 items[size-1] = NULL; 그래서 읽을 줄을했다를 제외하고 delete [] items; 이 잘했을 것이다라는 한 줄이있다, 그것은 전에 삭제/널링되고 있었다 소멸자가 호출되었습니다. C++에 대한 아주 기본적인 지식으로 인해 delete 명령이 빈 배열을 처리 할 수 ​​없다는 사실을 알지 못했습니다. 따라서 캡슐화로 인해 항목이 더 이상 존재하지 않으므로 항목을 삭제 한 행을 제거했습니다 (더 이상 액세스 할 수 없도록 상위 항목이 계속 변경됨)

어쨌든, 최종 강의 : delete [] items; 빈 배열을 처리하지 않습니다 (내 말은 짐작할 수 있습니다. delete 명령은 내 최종 배열보다 오래 걸릴 것으로 예상됩니다).

+2

완전한 코드가 없기 때문에 정확한 해결책처럼 들릴 수는 없으므로 확실하게 알 수 없습니다 ... 'NULL'은 효과적으로 '0'으로 정의 된 매크로입니다. 그래서이 모든 라인은'items' 배열의 정수 중 하나를'0'으로 설정했습니다. 소멸자에서'delete'에 영향을 주어서는 안됩니다. 'pop'에서'items [size - 1]'을 삭제 했습니까? – Excelcius

+0

그런 할당은 이유가 아닙니다. 'NULL'을 지정해도 아무 것도 삭제되지 않습니다. 특히,'int'에'NULL'을 대입하는 것은 그것을 0으로 만 설정할 것이고, 0으로 가득 찬 배열은 어떤 식 으로든 "비어 있지"않습니다. 'size-1'이 배열 밖의 인덱스 일 가능성이 높습니다. 그렇게 할 때'size'가 0보다 큰지 확인하십시오. – molbdnilo