分割故障和无效的大小为4
Segmentation fault and invalid size of 4?
我已经尝试弄清楚这个问题的解决方案已有一段时间了,这使我感到震惊。我知道它们的意思,但我似乎无法弄清我的代码中的问题。我跑了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 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();
}
希望这会有所帮助!
一个主要问题是,您将指针添加到列表中:
while (num > 0) {
Movie newMovie;
...
movieList->addMovie(&newMovie);
...
}
在上面的代码中,变量newMovie
不仅是局部的,不仅是函数,而且是循环内部的本地。这意味着,当循环迭代时,newMovie
对象不在范围内,并创建一个新的newMovie
对象。
将指针存储到这些范围的变量中意味着您有一个列表,上面有很多被销毁的物体的指针。提出这些指针会导致不确定的行为,很可能发生了很多崩溃。
相关文章:
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 将uint64_t转换为无效*并返回
- C++ SPDLOG 编译错误:变量或字段"set_error_handler"声明为无效
- 无法投射为无效 *
- 如何将 int** 转换为无效**?
- 将前向声明的类型转换为无效是否合法?
- 将实例强制转换为无效
- 重载的 QAbstractItemModel::flags 应该为无效的 QModelIndex 返回什么
- 双链接列表头引用为无效
- 声明为无效的变量或字段'name of var'
- 搜索一组点,其长度总和最小为矩形.算法是什么
- 声明为无效的变量或字段'Function'
- 二进制树中的节点为无效
- C++错误"变量或字段声明为无效"
- 声明为无效的变量或字段'insertion_sort' 第 13 行第 27 列
- 为无效字符创建循环
- 将auto_ptr转换为无效指针
- Qt/C++/Valgrind 在 QTcpSocket 断开连接时读取大小为 8 无效
- 如何要求年龄并将其他所有内容设置为无效
- 将方法从返回更改为无效