2014-03-07 40 views
0

我一直試圖弄清楚這個問題的解決方案很長一段時間了,它嚇壞了我。我知道他們的意思,但我似乎無法弄清楚我的代碼中的問題。我跑valgrind,它給了我這個:分割錯誤和4的無效大小?

LIST OF MOVIES: 
==14740== Invalid read of size 4 
==14740== at 0x8049176: Movie::getGenreType() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8049E30: Interface::printMovieData(List*) (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x804939E: Control::addMovies() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8049288: Control::createMovieDataBase() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8048C65: main (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== Address 0xbe92a154 is just below the stack ptr. To suppress, use: --workaround-gcc296-bugs=yes 
==14740== 
==14740== Invalid read of size 4 
==14740== at 0x804916A: Movie::getYear() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8049E5A: Interface::printMovieData(List*) (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x804939E: Control::addMovies() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8049288: Control::createMovieDataBase() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8048C65: main (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== Address 0xbe92a150 is just below the stack ptr. To suppress, use: --workaround-gcc296-bugs=yes 
==14740== 
==14740== Source and destination overlap in memcpy(0x884f034, 0x804915c, 138775300) 
==14740== at 0x402D9A9: memcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==14740== by 0x40D8B17: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==14740== by 0x40D93AF: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==14740== by 0x8049E70: Interface::printMovieData(List*) (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x804939E: Control::addMovies() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8049288: Control::createMovieDataBase() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8048C65: main (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== 
==14740== Invalid read of size 4 
==14740== at 0x402DB26: memcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==14740== by 0x40D8B17: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==14740== by 0x40D93AF: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==14740== by 0x8049E70: Interface::printMovieData(List*) (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x804939E: Control::addMovies() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8049288: Control::createMovieDataBase() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8048C65: main (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== Address 0x884f024 is 4 bytes before a block of size 138,775,313 alloc'd 
==14740== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==14740== by 0x40D77D3: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==14740== by 0x8049E70: Interface::printMovieData(List*) (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x804939E: Control::addMovies() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8049288: Control::createMovieDataBase() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8048C65: main (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== 
==14740== Invalid read of size 4 
==14740== at 0x402DB18: memcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==14740== by 0x40D8B17: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==14740== by 0x40D93AF: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==14740== by 0x8049E70: Interface::printMovieData(List*) (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x804939E: Control::addMovies() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8049288: Control::createMovieDataBase() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8048C65: main (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== Address 0x884f018 is 16 bytes before a block of size 138,775,313 alloc'd 
==14740== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==14740== by 0x40D77D3: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==14740== by 0x8049E70: Interface::printMovieData(List*) (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x804939E: Control::addMovies() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8049288: Control::createMovieDataBase() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8048C65: main (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== 
==14740== 
==14740== Process terminating with default action of signal 11 (SIGSEGV) 
==14740== Access not within mapped region at address 0x884EFFC 
==14740== at 0x402DB26: memcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==14740== by 0x40D8B17: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==14740== by 0x40D93AF: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==14740== by 0x8049E70: Interface::printMovieData(List*) (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x804939E: Control::addMovies() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8049288: Control::createMovieDataBase() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== by 0x8048C65: main (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) 
==14740== If you believe this happened as a result of a stack 
==14740== overflow in your program's main thread (unlikely but 
==14740== possible), you can try to increase the size of the 
==14740== main thread stack using the --main-stacksize= flag. 
==14740== The main thread stack size used in this run was 8388608. 
==14740== 
==14740== HEAP SUMMARY: 
==14740==  in use at exit: 138,775,357 bytes in 4 blocks 
==14740== total heap usage: 14 allocs, 10 frees, 138,775,545 bytes allocated 
==14740== 
==14740== LEAK SUMMARY: 
==14740== definitely lost: 0 bytes in 0 blocks 
==14740== indirectly lost: 0 bytes in 0 blocks 
==14740==  possibly lost: 20 bytes in 1 blocks 
==14740== still reachable: 138,775,337 bytes in 3 blocks 
==14740==   suppressed: 0 bytes in 0 blocks 
==14740== Rerun with --leak-check=full to see details of leaked memory 
==14740== 
==14740== For counts of detected and suppressed errors, rerun with: -v 
==14740== ERROR SUMMARY: 14 errors from 5 contexts (suppressed: 0 from 0) 
Segmentation fault (core dumped) 

這是我的代碼的一部分。如果您需要更多信息,我會很樂意提供。

void List::addMovie(Movie* newMovie) 
{ 
    if(newMovie==NULL) 
    return; 
    Node* currNode=head; 
    Node* prevNode=NULL; 
    Node* node= new Node(newMovie); 

    if(currNode==NULL){ 
    head=node; 
    tail=node; 
    return; 
    } 
    while(currNode!=NULL){ 
     prevNode=currNode; 
     currNode=currNode->next; 
    } 
    node->next=currNode; 
    prevNode->next=node; 
    node->prev=prevNode; 
    tail=node; 

} 

功能視圖/接口類:在控制類

void Interface::getMovieData(List* movieList) 
{ 
    int num,choice,year; 
    string title; 
    cout<<"\nEnter the number of movies: "; 
    cin>>num; 

    while (num > 0) { 
    Movie newMovie; 
    //m.movies[i] = new Movie(); 
    cout<<"\nEnter the next movie title: "<<endl; 
    cin>>title; 
    cout<<"Enter the year: "<<endl; 
    cin>>year; 

    cout<<"(1) "<< newMovie.getGenre(Movie::C_COMEDY)<<endl; 
    cout<<"(2) "<< newMovie.getGenre(Movie::C_DRAMA)<<endl; 
    cout<<"(3) "<< newMovie.getGenre(Movie::C_ACTION)<<endl; 
    cout<<"(4) "<< newMovie.getGenre(Movie::C_HORROR)<<endl; 
    cout<<"(5) "<< newMovie.getGenre(Movie::C_SF)<<endl; 
    cout<<"(6) "<< newMovie.getGenre(Movie::C_ADVENTURE)<<endl; 
    cout<<"(7) "<< newMovie.getGenre(Movie::C_WESTERN)<<endl; 
    cout<<"Choose genre: "<<endl; 
    cin>>choice; 

    newMovie.setMovieData(title, year,Movie::GenreType(choice - 1)); 
    cout<<newMovie.getTitle()<<endl; 
    movieList->addMovie(&newMovie); 
    --num; 
    } 

} 

功能:

void Control::addMovies(){ 
    List movieList; 
    view.getMovieData(&movieList); 
    server.update(Storage::ADD, &movieList); 
    view.printMovieData(&movieList); 
// movieList.cleanupData(); 
} 

希望這有助於!

+0

如果你有一個指向列表尾部的指針,爲什麼你在'addMovie'函數中循環?另外,在循環'currNode'總是'NULL'之後,所以'node-> next = currNode;'也可以''node-> next = NULL;' –

+3

歡迎來到C++,欣賞STL:你的朋友。看看'std :: list'。 – Bathsheba

回答

3

的一個主要問題是,你對局部變量的指針添加到您的列表:

while (num > 0) { 
    Movie newMovie; 

    ... 

    movieList->addMovie(&newMovie); 

    ... 
} 

在上面的代碼中,變量newMovie是本地的不僅是功能,但當地的循環中。這意味着當循環迭代時,newMovie對象超出了範圍,並且創建了一個新的newMovie對象。

存儲指向這些範圍變量的指針意味着您有一個指向大量被銷燬對象的指針的列表。取消引用這些指針會導致未定義的行爲,並且很可能會導致很多崩潰。

+0

謝謝!這真的很有幫助 – Manuel