在线判断退出代码为 6 的运行时错误 [关闭]

Posted

技术标签:

【中文标题】在线判断退出代码为 6 的运行时错误 [关闭]【英文标题】:Runtime erro with exit code 6 on online judge [closed] 【发布时间】:2015-12-26 12:02:39 【问题描述】:

我正在为在线法官做我的 C++ 作业。有 m 个长度为 n 的字符串。我需要找到一个新字符串的最小表达式,然后将它插入到 trie 树中。对于每个字符串,我需要返回第一个相同字符串的“位置数”。

以下是我的代码:

#include <cstdio>
using namespace std;

struct trie_node

    trie_node * firstSon;
    trie_node * nextBro;
    char value;
    bool isKey;
    int firstPos;
    trie_node(char value):firstSon(NULL), nextBro(NULL), value(value), isKey(false), firstPos(-1)
;

class trie_Tree

public:
    trie_Tree();
    int searchStr(char* desStr, int len, int selfPos);  

private:
    trie_node* searchChar(trie_node* fatherNode, char desChar);
    trie_node* root;
;

trie_Tree::trie_Tree()

    root = new trie_node('0');


int trie_Tree::searchStr(char * desStr, int len, int selfPos)

    trie_node* fatherNode = root;
    for (int i=0; i<len; i++)
    
        fatherNode = searchChar(fatherNode, desStr[i]);
    
    if (!fatherNode->isKey)
    
        fatherNode->isKey=true;
        fatherNode->firstPos=selfPos;
    
    return fatherNode->firstPos;


trie_node* trie_Tree::searchChar(trie_node* fatherNode, char desChar)

    if (fatherNode->firstSon==NULL)
    
        fatherNode->firstSon = new trie_node(desChar);
        return fatherNode->firstSon;
    

    trie_node* travNode = fatherNode->firstSon;
    while (travNode->nextBro!=NULL)
    
        if (travNode->value==desChar) return travNode;
        travNode=travNode->nextBro;
    

    if (travNode->value==desChar) return travNode;
    else
    
        travNode->nextBro = new trie_node(desChar);
        return travNode->nextBro;
    


char* getMinPre(char *s, int _size)

    int min=0, trav=1;
    while (trav<_size && min<_size)
    
        int i;
        for (i=0; i<_size; i++)
        
            if (s[(min+i)%_size]<s[(trav+i)%_size])
            
                trav=trav+i+1;
                break;
            
            else if (s[(min+i)%_size]>s[(trav+i)%_size])
            
                min=trav;
                trav=trav+1;
                break;
            
        
        if (i==_size) break;
    

    char * result=new char[_size];
    for (int i=0; i<_size; i++)
    
        result[i]=s[(min+i)%_size];
    
    return result;


int main()

    int m, n, result=0;
    scanf("%d %d", &m, &n);

    trie_Tree tt=trie_Tree();

    char* s=new char[n+1];
    for (int i=0; i<m; i++)
    
        scanf("%s", s);
        s=getMinPre(s, n);
        result = tt.searchStr(s, n, i);
        printf("%d\n", result);
    
    delete[] s;

    return 0;

我使用 VS 和 g++ 编译了我的代码,并多次运行我的程序进行测试。效果很好。

但是当在线判断系统返回运行时错误(退出代码6)。

我用谷歌搜索了“退出代码 6”。它由程序本身提出,例如通过进行 abort() 系统调用。它可能是由newdelete 操作引起的。但我仍然无法调试我的代码。

谁能帮帮我?

【问题讨论】:

【参考方案1】:

这是很多代码,但有些事情需要研究:

    在你的主函数中分配s:char* s=new char[n+1];。 您将s 传递给char* getMinPre(char *s, int _size)getMinPre 分配另一个缓冲区并返回它,覆盖s: s=getMinPre(s, n);(初始s 缓冲区的内存泄漏)。

这可能在主函数的循环中经常发生,因此您可能会耗尽内存。 (getMinPre 分配和覆盖指向已分配缓冲区的指针)。

由于这是一个在线评判平台,我建议提出极端测试用例(最小、最大元素、大量迭代)并在本地运行它们。

另外:添加一些调试信息。您甚至可以将它们封装在 #ifdef 中,这样您就不必删除它们。

【讨论】:

【参考方案2】:

在您的trie_Tree 构造函数中,您使用new 分配动态内存,但我在任何地方都找不到delete 那个对象。类似地,在searchChar 中,您分配了很多子节点,但从不删除它们。也在getMinPre。所有这些都会导致内存泄漏。您释放的唯一内存是main() 中的result

在 C++ 中,动态内存管理是一个非常复杂且容易出错的主题,每次您使用 new 分配一些内存时,您需要记住在某处使用 delete 取消分配它们。就像在 C 中一样,每次使用malloc() 时,都需要free()

您可以使用很多库来代替自己管理内存。对于链表,可以考虑 header&lt;vector&gt; 中的std::vector

顺便说一句,我认为这段代码看起来像 C with Class,而不是 C++。

【讨论】:

以上是关于在线判断退出代码为 6 的运行时错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

手机qt后台在线 不退出就一直都在线吗

c#关闭窗口怎么强制退出所有运行的线程

使用等于运算符时遇到问题。以退出代码 11 结束 [关闭]

电话簿项目错误。在编译器中没有发现错误,但它在运行时退出已经尝试了很长时间[关闭]

错误:cmd:将应用程序运行到 android apk 时命令失败,退出代码为 ENOENT

在线校准相机中校准相机时出现 OpenCV 运行时错误