C++ 函数不会返回

Posted

技术标签:

【中文标题】C++ 函数不会返回【英文标题】:C++ function will not return 【发布时间】:2011-02-14 14:14:36 【问题描述】:

我有一个正在调用的函数,它一直运行到它应该返回但不返回的位置。如果我在函数的最后找到一些用于调试的东西,它会显示但函数不会返回。

fetchData 是我指的函数。它被 outputFile 调用。 cout 显示“在此处完成”但不显示“已获取数据”

我知道这段代码很乱,但谁能帮我解决这个问题?

谢谢

  //Given an inode return all data of i_block data
  char* fetchData(iNode tempInode)
   char* data;
   data = new char[tempInode.i_size];
   this->currentInodeSize = tempInode.i_size;

   //Loop through blocks to retrieve data
   vector<unsigned int> i_blocks;
   i_blocks.reserve(tempInode.i_blocks);

   this->currentDataPosition = 0;
   cout << "currentDataPosition set to 0" << std::endl;
   cout << "i_blocks:" << tempInode.i_blocks << std::endl;
   int i = 0;
   for(i = 0; i < 12; i++)
    if(tempInode.i_block[i] == 0)
     break;
    i_blocks.push_back(tempInode.i_block[i]);
   

   appendIndirectData(tempInode.i_block[12], &i_blocks);
   appendDoubleIndirectData(tempInode.i_block[13], &i_blocks);
   appendTripleIndirectData(tempInode.i_block[14], &i_blocks);

   //Loop through all the block addresses to get the actual data
   for(i=0; i < i_blocks.size(); i++)
    appendData(i_blocks[i], data);
   
   cout << "done here" << std::endl;

   return data;
  




  void appendData(int block, char* data)
   char* tempBuffer;
   tempBuffer = new char[this->blockSize];

   ifstream file (this->filename, std::ios::binary);
   int entryLocation = block*this->blockSize;
   file.seekg (entryLocation, ios::beg);
   file.read(tempBuffer, this->blockSize);

   //Append this block to data
   for(int i=0; i < this->blockSize; i++)
    data[this->currentDataPosition] = tempBuffer[i];
    this->currentDataPosition++;
   
   data[this->currentDataPosition] = '\0';
  

  void outputFile(iNode file, string filename)
   char* data;
   cout << "File Transfer Started" << std::endl;
   data = this->fetchData(file);
   cout << "data fetched" << std::endl;

   char *outputFile = (char*)filename.c_str();
   ofstream myfile;
   myfile.open (outputFile,ios::out|ios::binary);
   int i = 0;
   for(i=0; i < file.i_size; i++)
    myfile << data[i];
   
   myfile.close();
   cout << "File Transfer Completed" << std::endl;
   return;
  

【问题讨论】:

你正在做的是一种叫做“printf调试”的东西,一般不推荐。您将需要使用实际的调试器。另外,请在每个制表符级别缩进一个以上的空格。这简直是​​无法阅读…… @rlbond 我所做的几乎所有调试都是“printf 调试”——实践绝对没有错。 Printf 调试非常适合找出一般故障区域,但对于细节,调试器提供的帮助更多。 第二个:有时使用 printf 会容易得多。 @peachy 细节方面,我倾向于靠思考。 【参考方案1】:

您的程序中可能有其他代码行打印“在此处完成”,或者您正在破坏堆栈并影响返回地址。但我在堆栈上看不到任何可能溢出的缓冲区。

您是否尝试过使用调试器?

【讨论】:

好的,我正在使用 Visual C++ 2008 Express 并且之前还没有真正使用过调试器。我在 cout 当您运行调试器并到达断点时,您是否看到任何错误?如果你单步执行并点击返回,执行到哪里去? 好的,在返回语句的断点处我得到了这个错误:ext2Interface.exe 中 0x77004230 处的第一次机会异常:0xC0000005:访问冲突读取位置 0x00000004。 有谁知道我该如何解决这个 First-chance 异常? 我在 appendData 函数中溢出了数据数组。【参考方案2】:

设置断点,在调试器中单步执行,查看实际执行开始与您认为应该发生的不同的地方。

通过快速查看您的代码,您应该会收到第二条消息,但在调试器中查看实际发生的情况比对可能出错的任何理论上的思考更有帮助。看起来你会到处泄漏内存,我没有看到任何deletes 与你的news 一起使用。

【讨论】:

【参考方案3】:

如果 appendData() 不断追加到 i_blocks,那么数据结构会不断增长,i_blocks.size() 也会不断增长。这永远不会退出!

   //Loop through all the block addresses to get the actual data
   for(i=0; i < i_blocks.size(); i++)
    appendData(i_blocks[i], data);
   

【讨论】:

但是OP说显示“done here”,这意味着该部分完成了。 除了 Mike 说“在这里完成”行被显示,并且 printf 出现在调用 appendData() 之后和返回之前。 这部分确实像其他人所说的那样完成。 appendData 不会在数组中添加更多值。它正在设置已经存在的值。

以上是关于C++ 函数不会返回的主要内容,如果未能解决你的问题,请参考以下文章

c++函数返回一个数组

c++类的构造函数

c++中函数的内存注意项

C++ 如何制作二维向量函数?

《C++ 101条建议》学习笔记——第一章快速入门

C++基础--inline