C++ 分段错误和无效大小4?

C++ 分段错误和无效大小4?,c++,C++,我一直在想这个问题的解决办法,现在已经有一段时间了,这让我很害怕。我知道它们的意思,但我似乎无法从代码中找出问题所在。我跑了valgrind,它给了我这个: LIST OF MOVIES: ==14740== Invalid read of size 4 ==14740== at 0x8049176: Movie::getGenreType() (in /home/student/Documents/SoftwareEngineering/ASS3/mdb) ==14740==

我一直在想这个问题的解决办法,现在已经有一段时间了,这让我很害怕。我知道它们的意思,但我似乎无法从代码中找出问题所在。我跑了valgrind,它给了我这个:

   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 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;
  }

}

希望这有帮助

一个主要问题是将指向局部变量的指针添加到列表中:

while (num > 0) {
    Movie newMovie;

    ...

    movieList->addMovie(&newMovie);

    ...
}
在上面的代码中,变量
newMovie
不仅是函数的局部变量,而且是循环内部的局部变量。这意味着循环迭代时,
newMovie
对象超出范围,并创建一个新的
newMovie
对象


存储指向这些作用域变量的指针意味着您有一个列表,其中包含指向许多已销毁对象的指针。取消对这些指针的引用会导致未定义的行为,很可能会导致大量崩溃。

一个主要问题是您将指向局部变量的指针添加到列表中:

while (num > 0) {
    Movie newMovie;

    ...

    movieList->addMovie(&newMovie);

    ...
}
在上面的代码中,变量
newMovie
不仅是函数的局部变量,而且是循环内部的局部变量。这意味着循环迭代时,
newMovie
对象超出范围,并创建一个新的
newMovie
对象


存储指向这些作用域变量的指针意味着您有一个列表,其中包含指向许多已销毁对象的指针。取消对这些指针的引用会导致未定义的行为,很可能会导致大量崩溃。

一个主要问题是您将指向局部变量的指针添加到列表中:

while (num > 0) {
    Movie newMovie;

    ...

    movieList->addMovie(&newMovie);

    ...
}
在上面的代码中,变量
newMovie
不仅是函数的局部变量,而且是循环内部的局部变量。这意味着循环迭代时,
newMovie
对象超出范围,并创建一个新的
newMovie
对象


存储指向这些作用域变量的指针意味着您有一个列表,其中包含指向许多已销毁对象的指针。取消对这些指针的引用会导致未定义的行为,很可能会导致大量崩溃。

一个主要问题是您将指向局部变量的指针添加到列表中:

while (num > 0) {
    Movie newMovie;

    ...

    movieList->addMovie(&newMovie);

    ...
}
在上面的代码中,变量
newMovie
不仅是函数的局部变量,而且是循环内部的局部变量。这意味着循环迭代时,
newMovie
对象超出范围,并创建一个新的
newMovie
对象


存储指向这些作用域变量的指针意味着您有一个列表,其中包含指向许多已销毁对象的指针。取消引用这些指针会导致未定义的行为,很可能会导致大量崩溃。

如果有指向列表尾部的指针,为什么要在
addMovie
函数中循环?此外,循环后
currNode
将始终为
NULL
,因此赋值
node->next=currNode
也可以是
node->next=NULL欢迎来到C++,享受STL:它是你的朋友。查看
std::list
。如果有指向列表尾部的指针,为什么要在
addMovie
函数中循环?此外,循环后
currNode
将始终为
NULL
,因此赋值
node->next=currNode
也可以是
node->next=NULL欢迎来到C++,享受STL:它是你的朋友。查看
std::list
。如果有指向列表尾部的指针,为什么要在
addMovie
函数中循环?此外,循环后
currNode
将始终为
NULL
,因此赋值
node->next=currNode
也可以是
node->next=NULL欢迎来到C++,享受STL:它是你的朋友。查看
std::list
。如果有指向列表尾部的指针,为什么要在
addMovie
函数中循环?此外,循环后
currNode
将始终为
NULL
,因此赋值
node->next=currNode
也可以是
node->next=NULL欢迎来到C++,享受STL:它是你的朋友。查看
std::list
。谢谢!这真的很有用谢谢你!这真的很有用谢谢你!这真的很有用谢谢你!这真的很有帮助