【问题标题】:Segmentation fault - big loop分段错误 - 大循环
【发布时间】:2013-09-21 15:13:34
【问题描述】:

我在测试客户端-服务器文件传输时遇到分段错误错误。我在下载端有这段代码(这是我认为问题所在):

else if (info_socket[fds[i].fd] == RECIBIENDO) {
                close_conn = FALSE;
                buffer = (char*) malloc(1500);
                rc = recv(fds[i].fd, buffer, 1500, 0);
                if (rc < 0) {
                    if (errno != EWOULDBLOCK) {
                        perror("  recv() failed");
                        close_conn = TRUE;
                        map<int, info_trans*>::iterator it = descargas.find(fds[i].fd);
                        descargas.erase(it);
                    }
                } else if (rc == 0) {
                    close_conn = TRUE;
                    map<int, info_trans*>::iterator it = descargas.find(fds[i].fd);
                    descargas.erase(it);
                } else {
                    arch = fopen((directorio + descargas[fds[i].fd]->nombre_archivo).c_str(), "ab");
                    printf("%s -- %d",(directorio + descargas[fds[i].fd]->nombre_archivo).c_str(),fds[i].fd);
                    totalEscrito = fwrite(buffer, 1, rc, arch);
                    descargas[fds[i].fd]->bytes_descargados = descargas[fds[i].fd]->bytes_descargados + totalEscrito;
                    fclose(arch);
                    file_descript = open((directorio + descargas[fds[i].fd]->nombre_archivo).c_str(), O_RDONLY);
                    file_size = get_size_by_fd(file_descript);
                    file_buffer = (char*) mmap(0, file_size, PROT_READ, MAP_SHARED, file_descript, 0);
                    MD5((unsigned char*) file_buffer, file_size, result);
                    mdString = (char*) malloc(33);
                    for (int r = 0; r < 16; r++)
                        sprintf(&mdString[r * 2], "%02x", (unsigned int) result[r]);
                    if (strcmp(mdString, (descargas[fds[i].fd]->md5).c_str()) == 0) {
                        close_conn = TRUE;
                        map<int, info_trans*>::iterator it = descargas.find(fds[i].fd);
                        descargas.erase(it);
                    }
                    free(mdString);
                   free(file_buffer);
                    close(file_descript);
                }

服务器在发送数据的类似循环中。奇怪的是,如果我在笔记本电脑上运行它,它可以工作,但在学校电脑的虚拟机上会抛出分段错误。 如果有使用VMware Player调试内存的好方法,也请告诉我。 谢谢你,对不起我的英语水平。

【问题讨论】:

  • 错误代码在一台机器上正常运行但在另一台机器上失败并不奇怪。这很正常。
  • 你真的应该考虑将你的函数拆分成更小、更易读的函数,谁知道也许错误会变得很明显。

标签: c++ segmentation-fault malloc free


【解决方案1】:

free(file_buffer); 是错误的。我猜你的意思是munmap(file_buffer, file_size);

【讨论】:

  • 就是这样!非常感谢!
  • @user2796026 没问题,您应该考虑一下上面评论中的 claptrap 所说的内容。当您编写较小的函数时,这种错误更容易发现。
猜你喜欢
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 2015-11-26
  • 1970-01-01
相关资源
最近更新 更多