4

所以我已经调试这个错误几个小时了。我使用 Ogre3d 编写了一个相关的程序,只是因为它不加载符号,所以它不会让我堆栈跟踪,这使得找到崩溃的位置变得更加困难。所以,在我调用一个特定的函数之前写,我打印出“开始”,然后我调用这个函数,然后在我打印“停止”之后立即调用。在整个函数中,我打印出字母 AF,其中 F 在函数返回之前打印出来(最后一个 '}' 上方的一行) '。这是否意味着崩溃发生在某处之间?我唯一能想到的是在函数期间分配的一些内存的释放过程中出现了问题。我'

4

4 回答 4

4

大多数时候,发生一些奇怪和无法理解的事情,都是因为其他事情。

您的代码中可能有一些悬空指针(即使在远离该函数的地方)指向一些随机存储单元。

您可能使用过这样的悬空指针,它可能会导致覆盖您需要的一些内存单元。这样做的结果是您通过更改在别处定义的一些变量、一些常量甚至一些代码来改变程序的行为!

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


无论如何,如果您能够本地化您的崩溃源并编写一小段代码将崩溃发布在这里 - 它可能只是您的函数中的一个简单错误,尽管从您的描述中听起来不太可能。

于 2011-01-15T09:57:53.700 回答
2

可能意味着当函数返回并且某个析构函数正在触发时发生错误。很有可能你有一些析构函数试图释放它不拥有的内存,或者在日志中注销某个缓冲区的末尾,等等。

如果您不刷新输出流,可能会出现另一种需要注意的可能性。可能正在打印“Stopping”,但在点击stdout. 确保检查这一点,因为如果这是发生的事情,你会在错误的树上吠叫。

于 2011-01-15T09:55:32.260 回答
2

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

该函数具有以下签名:

std::shared_ptr<blDataNode> blConditionBasedDataSelectionUI::selectData(std::shared_ptr<blDataNode> inputData)
{
    // My error was due to the function
    // not returning anything
}
于 2018-06-11T20:36:06.677 回答
0

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

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

令人困惑的是,我正在使用 Xcode 并且应用程序在“返回 0”之后立即崩溃,并带有难以理解的消息“线程 13:信号 SIGABRT”。但是,使用 Visual Studio 向我展示了 index 超出范围的行。

于 2019-09-15T02:39:54.360 回答