C++ 什么会导致返回函数崩溃?C++;

C++ 什么会导致返回函数崩溃?C++;,c++,function,crash,return,void,C++,Function,Crash,Return,Void,所以我已经调试这个错误好几个小时了。我使用Ogre3d编写程序只是因为它不加载符号,所以它不允许我堆叠跟踪,这使得查找崩溃位置更加困难。所以,在我调用一个特定函数之前,我先打印出“开始”,然后我调用这个函数,然后在打印出“停止”之后立即写下。在整个函数中,我打印出字母A-F,其中F在函数返回之前打印(最后一个“}”上方的一行),奇怪的是,当崩溃发生时,它是在打印“F”之后,但没有“停止”。这是否意味着坠机发生在两者之间的某个地方?我能想到的唯一一件事是,在释放函数期间分配的一些内存时出现了一些问

所以我已经调试这个错误好几个小时了。我使用Ogre3d编写程序只是因为它不加载符号,所以它不允许我堆叠跟踪,这使得查找崩溃位置更加困难。所以,在我调用一个特定函数之前,我先打印出“开始”,然后我调用这个函数,然后在打印出“停止”之后立即写下。在整个函数中,我打印出字母A-F,其中F在函数返回之前打印(最后一个“}”上方的一行),奇怪的是,当崩溃发生时,它是在打印“F”之后,但没有“停止”。这是否意味着坠机发生在两者之间的某个地方?我能想到的唯一一件事是,在释放函数期间分配的一些内存时出现了一些问题。我从来没有遇到过这样的情况,我会不断检查以确保它在我认为的地方出错。

这可能意味着当函数返回并触发某个析构函数时,就会发生错误。很可能您有一些析构函数试图释放它不拥有的内存,或者在日志中写下一些缓冲区的结尾,等等


如果不刷新输出流,可能会出现另一种需要注意的可能性。可能正在打印“停止”,但在点击
stdout
之前正在缓冲。一定要检查这一点,因为如果是这样的话,你就找错了方向。

大多数时候,当一些奇怪的、不可理解的事情发生时,都是因为其他原因

您可以在代码中(甚至在远离该函数的地方)有一些指向一些随机内存单元

您可能使用了这种悬空指针,它可能会导致覆盖所需的一些内存单元。这样做的结果是,您通过更改其他地方定义的某些变量、某些常量甚至某些代码来更改程序的行为

我建议您使用一些能够检查和报告错误内存访问的工具来调试应用程序,如



无论如何,如果您能够定位崩溃的源代码,并编写一小段将崩溃的代码,将其发布到此处--这可能只是函数中的一个简单错误,尽管从您的描述来看,听起来不太可能。

我也遇到过类似的问题,结果证明,当签名期望返回类型为std::shared_ptr时,我的函数没有返回任何内容,即使我没有在任何地方使用返回

该函数具有以下签名:

std::shared_ptr<blDataNode> blConditionBasedDataSelectionUI::selectData(std::shared_ptr<blDataNode> inputData)
{
    // My error was due to the function
    // not returning anything
}
std::shared\u ptr blConditionBasedDataSelectionUI::selectData(std::shared\u ptr inputData)
{
//我的错误是由函数引起的
//不归还任何东西
}

我遇到了同样的问题,结果是在添加新项之前忘记初始化向量,这导致函数在将向量与其他列表进行比较时出错

std::vector<cv::Point> lefteyeCV;
void Init() {
    // I need to add "lefteyeCV.clear();" here!
    for (int i = 0; i < 8; i++) {
        lefteyeCV.push_back(cv::Point(0, 0));
    }
}

// the following comparison will crash after "return 0" 
// because cl_ is of size 8, but if I run "Init()" twice, lefteyeCV.size() = 16
// then the comparison is out of range.
int irisTrack(){
    for (int i = 0; i < lefteyeCV.size(); i++) {
        cl_[i] = cv::Point(lefteyeCV[order[i]].x - leftRect.x, lefteyeCV[order[i]].y - leftRect.y);
    }
    return 0;
}
std::vector lefteyeCV;
void Init(){
//我需要在这里添加“lefteyeCV.clear();”!
对于(int i=0;i<8;i++){
lefteyeCV.push_back(cv::Point(0,0));
}
}
//“返回0”后,以下比较将崩溃
//因为cl_u的大小是8,但是如果我运行“Init()”两次,lefteyeCV.size()=16
//那么比较超出了范围。
int irisTrack(){
对于(int i=0;i

令人困惑的是,我使用的是Xcode,应用程序在“return0”之后立即崩溃,并显示无法识别的消息“thread13:SIGABRT”。然而,使用Visual Studio向我展示了索引超出范围的地方。

各种情况。为什么不显示相关的代码呢?可能是任何东西——例如,如果你通过散乱的指针弄乱了堆栈——但它听起来像是通过调用析构函数表现出来的bug。试着用尽可能小但完整的程序重现问题。发布代码(如果流程没有发现错误)。干杯,如果你不发布代码,就不能告诉你任何事情。发布的代码会被大量复制/粘贴,相关性会降低。但是我相信我发现了这个问题,正如下面列出的答案之一所说的。如果在发生事情时使用stdio进行跟踪,那么记得每次编写日志消息时调用
fflush()。我为一个数组(大小为100)分配了空间,但是我修改了索引超过100的值。奇怪的是,这不是我能做到的问题。我不知道这是释放还是更具体地说,是我在帧寄存器外的内存上写的(我猜),当它返回时,内存混乱且不正确。@JeanOTF-如果是这种情况,您可能在分配的块的页脚上重写了一些数据。当内存分配器试图回收它时,它可能导致崩溃,因为它希望找到某种内部数据(例如,指向下一个块的指针),但却发现了垃圾。这种情况经常发生。正如我在下面提到的,显然我是在索引数组之外的内存中写入的(我为100分配了空间,并在上面写入了索引),但这并没有导致崩溃,而是因为我猜我弄乱了该帧之外的堆栈,当它返回时,所有内容都被弄乱了。我只是困惑了为什么它允许我玩这些数据。C++不是一种管理语言:编译器试图静态检查它能做的任何事情,但是它不会运行任何运行时检查。错误发生在运行时(通过静态分析代码,编译器无法确定是否只访问正确的数组元素)。Valgrind是一个工具,可以检查运行时发生的事情,它基本上是托管语言的虚拟机所做的一部分