运行时出错,在线判断上的退出代码为6

Runtime erro with exit code 6 on online judge

本文关键字:退出 代码 出错 在线 判断 运行时      更新时间:2023-10-16

我正在一个在线评委上做c++作业。有m个长度为n的字符串。我需要找到一个新字符串的最小表达式,然后将其插入到trie树中。对于每个字符串,我需要返回第一个相同字符串的"positon数"。

以下是我的代码:

#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("%dn", result);
    }
    delete[] s;
    return 0;
}

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

但当在线评判系统返回运行时错误(exitcode 6)。

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

有人能帮我吗?

这是很多代码,但需要研究一些内容:

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

这种情况可能在主函数的循环中经常发生,因此可能会耗尽内存。(getMinPre分配并重写指向已分配缓冲区的指针)。

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

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

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

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

有很多库可以使用,而不是自己管理内存。对于链接列表,您可以考虑标题<vector>中的std::vector

顺便说一句,我认为这段代码看起来像带有类的C,而不是C++。

相关文章: