【发布时间】:2012-02-05 21:18:51
【问题描述】:
当我将代码(粘贴在下面)提交到在线 gcc 编译器时,我收到以下错误消息。
* 检测到 glibc /run-1326102706-2046832693/solution: double free or corruption (!prev): 0x091901a8 ** =======
代码如下:
# include <iostream>
# include <string>
# include <list>
# include <cstring>
using namespace std;
int main()
{
int test_cases, i, score, str_len;
string str;
char first_char, current_char;
list <int> strlist;
list <int> :: iterator it;
cin>>test_cases;
char *cstr[test_cases]; //Creating an array of cstr pointers (test_cases number of pointers)
while(test_cases > 0)
{
cin>>str;
first_char = str.at(0);
str_len = str.length();
score = str_len;
strlist.clear();
cstr[test_cases-1] = new char[str_len];
strcpy(cstr[test_cases-1],str.c_str()); //copying the input str into cstr. This is done to minimize the complexity of std::string's at function.
for(i=1;i<str_len; i++)
{
current_char = *(cstr[test_cases-1]+i);
if (current_char == first_char)
{
score++; strlist.push_front(1);
it = strlist.begin();
if (it != strlist.end())
it++;
}
while (!strlist.empty() && it != strlist.end())
{
if (current_char == *(cstr[test_cases-1] + *(it)))
{
(*it)++;it++;score++;
}
else
it = strlist.erase(it);
}
if (!strlist.empty())
it = strlist.begin();
}
cout<<score<<endl;
delete(cstr[test_cases-1]);
test_cases--;
}
return 0;
}
正如代码本身所提到的,我最初使用 std::string,但发现 std::string.at 函数非常慢(尤其是因为这个问题的输入字符串非常大)。所以我决定将字符串输入存储在一个字符数组中,这样就可以直接索引到一个特定的位置。
感谢任何帮助。
【问题讨论】:
-
你试过运行 valgrind 吗?
-
string的c_str方法可用于从中取出c-style字符数组。无需为此编写自己的字符串类。 -
通过什么输入导致崩溃?
-
因为这是提交给 topcoder 类型的在线编译器 - 我无法控制编译器或输入。不过我可以尝试在本地机器上运行它。