在线判断时出现运行时错误,退出代码为 6

Runtime erro with exit code 6 on online judge

我正在在线判断上做c++作业。有 m 个字符串,长度为 n。我需要找到一个新字符串的最小表达式,然后将它插入到一个特里树中。对于每个字符串,我需要 return 第一个相同字符串的 "positon number"。

以下是我的代码:

#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++ 编译了我的代码,并多次运行我的程序进行测试。效果很好。

但是在线判断系统时returned运行时错误(exitcode 6).

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

谁能帮帮我?

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

  1. 在您的主函数中,您分配了 schar* s=new char[n+1];
  2. 您将 s 传递给 char* getMinPre(char *s, int _size)
  3. getMinPre 分配另一个缓冲区,returns 它,覆盖 ss=getMinPre(s, n);(初始 s 缓冲区的内存泄漏)。

这可能会在主函数的循环中发生很多次,因此您可能 运行 内存不足。 (getMinPre 分配并覆盖指向已分配缓冲区的指针)。

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

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

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

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

您可以使用很多库,而不必自己管理内存。对于链表,你可以考虑std::vector in header<vector>.

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