glibc detected - double free or corruption
问题描述:
当我将代码(粘贴到下面)提交到在线gcc编译器时,出现以下错误消息。glibc detected - double free or corruption
* glibc的检测 /运行1326102706-2046832693 /解决方案:双重释放或腐败(上一个!):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功能是相当慢(esepcially因为这个问题有真正的大我输入字符串)。所以我决定将字符串输入存储在一个字符数组中,这样可以直接索引到特定的位置。
感谢任何帮助。
答
有两个问题,我可以看到:
cstr[test_cases-1] = new char[str_len]; // Not allocating space for terminating NULL.
delete(cstr[test_cases-1]); // Incorrect delete, should be delete[]
// As already pointed out by mooware
更改以下两行:
cstr[test_cases-1] = new char[str_len + 1];
delete[] cstr[test_cases-1];
答
您正在使用array-new(“new char [str_len]”)来分配字符串,但标量删除(“delete(cstr [test_cases-1])”)将其删除。你应该总是匹配new和delete操作符,所以当你使用array-new时,也可以使用array-delete(“delete [] cstr [test_cases-1]”)。
答
你有两个错误。一个在这里:
cstr[test_cases-1] = new char[str_len];
strcpy(cstr[test_cases-1],str.c_str());
你分配一个字节太少。这应该是new char[str_len+1]
,因为strcpy
复制终止符。
另一个是在这里:
delete(cstr[test_cases-1]);
你不能用new[]
分配和使用delete
解除分配。如果用new[]
进行分配,则必须用delete[]
取消分配。
你尝试运行的valgrind? – PlasmaHH 2012-01-09 10:12:15
'string'的''c_str'方法可以用来获取'c-style'字符数组。没有必要为此编写自己的字符串类。 – Naveen 2012-01-09 10:12:36
随着什么输入你会崩溃? – 2012-01-09 10:14:29