在线判断时出现运行时错误,退出代码为 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() 系统调用。这可能是由new
和delete
操作引起的。但是我仍然无法调试我的代码。
谁能帮帮我?
代码很多,但有些事情需要研究:
- 在您的主函数中,您分配了
s
:char* s=new char[n+1];
。
- 您将
s
传递给 char* getMinPre(char *s, int _size)
。
getMinPre
分配另一个缓冲区,returns 它,覆盖 s
:s=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++。
我正在在线判断上做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() 系统调用。这可能是由new
和delete
操作引起的。但是我仍然无法调试我的代码。
谁能帮帮我?
代码很多,但有些事情需要研究:
- 在您的主函数中,您分配了
s
:char* s=new char[n+1];
。 - 您将
s
传递给char* getMinPre(char *s, int _size)
。 getMinPre
分配另一个缓冲区,returns 它,覆盖s
:s=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++。