所以我现在几个小时都在调试这个错误。我使用Ogre3d编写程序只是因为它不加载符号所以它不会让我堆栈跟踪,这使得查找崩溃的位置更加困难。所以,在我调用特定函数之前写入我打印出“Starting”然后我调用函数并在打印“Stopping”之后立即调用。在整个函数中,我打印出字母AF,其中F在函数返回之前打印(在最后一个'}'之上一行)奇怪的是当崩溃发生时它是在'F'打印之后但是没有'停止' ”。这是否意味着崩溃发生在某个地方之间?我唯一能想到的是在释放函数期间分配的一些内存时出错。我从来没有发生过这样的事情,我会继续检查以确保它在我认为的地方出错。
答案 0 :(得分:4)
大多数情况下,当发生奇怪和不可理解的事情时,这是因为其他事情。
您的代码中可能会有一些dangling pointers(即使在远离该功能的地方)指向某些随机内存单元格。
你可能已经使用了这种悬空指针,它可能导致覆盖你需要的一些存储单元。结果是你改变了程序的行为,改变了别处定义的变量,一些常量,甚至一些代码!
我建议您使用一些能够检查和报告错误内存访问的工具来调试您的应用程序,例如Valgrind。
无论如何,如果你能够本地化崩溃的来源并编写一小段代码,这些代码将在此处发布 - 它可能只是你的函数中的一个简单错误,尽管听起来不太可能,描述
答案 1 :(得分:2)
这个可能是意味着当函数返回并且某些析构函数被触发时发生错误。有可能你有一些析构函数试图释放它不拥有的内存,或者在日志中写下一些缓冲区的结尾等。
如果您没有刷新输出流,可能会出现另一种可能的注意事项。 “Stopping”可能会被打印出来,但在点击stdout
之前会被缓冲。一定要检查一下,因为如果发生这种情况你就会咆哮错误的树。
答案 2 :(得分:0)
我遇到了类似的问题,结果是当签名期望返回类型为std :: shared_ptr时,我的函数没有返回任何内容,即使我没有在任何地方使用返回。
该功能具有以下签名:
std::shared_ptr<blDataNode> blConditionBasedDataSelectionUI::selectData(std::shared_ptr<blDataNode> inputData)
{
// My error was due to the function
// not returning anything
}
答案 3 :(得分: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会向我显示索引超出范围的那一行。