2012-04-11 2 views
0

나는 다음과 같은 코드로 "분할 오류 (코어 덤프)"런타임 오류가 점점 오전 : 나는 delete list; 라인 아래로 오류를 좁혀분할 오류 C++

#include <iostream> 
#include "Student.h" 
#include "SortedList.h" 

using namespace std; 

#define BOUNDS 100 

int main() { 

    SortedList *list = new SortedList(); // points to the sorted list object 
    Student *create[BOUNDS]; // array to hold 100 student objects 
    int num = 100000; // holds different ID numbers 

    // fills an array with 100 students of various ID numbers 
    for (int i = 0; i < BOUNDS; i++) { 
     create[i] = new Student(num); 
     num += 10; 
    } 

    // insert all students into the sorted list 
    for (int i = 0; i < BOUNDS; i++) 
    list->insert(create[i]); 

    // individually deletes each student 
    num = 100000; 
    for (int i = 0; i < BOUNDS; i++) { 
     delete list->find(num); 
    num += 10; 
    } 

    // insert all students into the sorted list 
    for (int i = 0; i < BOUNDS; i++) 
    list->insert(create[i]); 

    num = 100000; 
    for (int i = 0; i < BOUNDS; i++) { 
    list->remove(num); 
    num += 10; 
    } 

    cout << "test2" << endl; 
    delete list; 
    return 0; 
} 

을 (또는 둘 중 하나가 먼저 발생). 나는 왜 이것이 이것이 무엇이며 어떻게 고칠 수 있을지 궁금해하고있다. 이 문제에 대한 통찰력이 유용 할 것입니다.

+1

당신은 유닉스 시스템에서 이것을 실행하는 것처럼 보입니다. 그러므로 Valgrind를 사용하십시오;) – 0xC0000022L

+2

"// 다양한 ID 번호의 100 명의 학생으로 배열 채우기"이 루프는이 주석이 말하는 것을하지 않습니다. –

+1

참고로, 누군가가'namespace std;를 사용할 때마다, 나는 강아지를 걷어 찼다. 가난한 강아지에 대해 다시 생각하기 전에 생각하십시오. – cHao

답변

1

내가 볼 수있는 두 가지 문제점이 있습니다.

첫째,이 루프 : 당신은 동적 Student s의 무리를 만들고 x의 최신 하나를 넣고 이전이 손실된다

for (int i = 0; i < BOUNDS; i++) { 
    x = new Student(num); 
    num += 10; 
} 

. 이렇게하면 동적으로 100 Student이 생성되고 99 개가 유출됩니다. 또한 위의 설명처럼 배열이 Student으로 채워지지 않습니다. 나는 네가 여기서 무엇을하려고하는지 잘 모르겠다. 그래서 네가해야 할 일에 대해선 말할 수 없다.

둘째, 당신은 여기 delete를 호출 : 자동 스토리지 (스택)에

delete list->find(num); 

Student에들 (당신이 createStudent들에 대한 포인터를 사용하여 목록을 작성하기 때문에 자동 Student의를 보유하고), 이는 정의되지 않은 동작으로 이어지고 아마도 segfault의 원인 일 수 있습니다. 배열이 main의 끝에서 범위를 벗어날 때 할당이 해제되기 때문에이 Student을 할당 해제 할 필요가 없습니다. 구현 방법 StudentList 모른 채

0

당신은 확실히 누출되는 메모리 : 포인터 추적 할 수있는 Student의 ctor에 어떻게 든 마술, 어딘가에서 자신을 삽입하지 않는

// fills an array with 100 students of various ID numbers 
for (int i = 0; i < BOUNDS; i++) { 
    x = new Student(num); 
    num += 10; 
} 

x는이 코드에서 유출된다.

그리고 충돌 또는 관련되었을 수도 있습니다.

+0

'num'은 배열의 인덱스로 사용되지 않으므로'num/10> NBOUND'는 중요하지 않습니다. 또한, 'delete'는 동적으로 할당되지 않은 객체 인 "초기화되지 않은 객체 삭제"가 아니라 "삭제"객체이며, 정의되지 않은 동작을 발생시킵니다. –

+0

죄송 합니다만, 오류가 두 개 있습니다 :'// ERROR : '초기화되지 않았습니다'(배열의 객체가 내장 유형이 아니면 초기화됩니다) 및'ERROR : 초기화되지 않은 객체를 삭제합니다 (0이 아닐 수도 있습니다.)'내가 위에서 말한 것 때문에 잘못되었습니다. –

+0

어떤 C++ 컴파일러를 사용하고 있습니까? 이것은 단순히 사실이 아닙니다. 'create'의 내용을 초기화 한 코드와 스택 변수는 당신이 주장하는 것처럼 자동 초기화되지 않습니다. C++ 표준에 대해 알고 싶습니다. 왜냐하면 이것이 내가 처음 듣기 때문입니다 ... – 0xC0000022L

0

,이

list->insert(&create[i]);

목록에 스택 할당 객체를 추가하고, 다음 delete list->find(num); 시도이 스택 할당 삭제 ... 어둠 속에서 샷의 종류 만 개체입니다. 할당 된 개체를 delete 스택 할 수 없습니다.

이 외에도, 첫 번째 for 루프에 메모리 누수가 있습니다.

그리고 나는 닌자했습니다.

0

이 줄은 문제가 있습니다 그 시점에서

list->insert(&create[i]); 

, create가 할당 된,하지만 아무것도 그것으로 넣어 없습니다. 아마도 x = new Student(num)의 결과가 거기에 지정되어야합니다.

0

"create"배열이 스택에 할당됩니다.이 오류가 발생하는 이유로 스택 할당 메모리를 삭제하려고합니다.

delete list-> find (num);