C++ 检测到glibc-双重自由或损坏

C++ 检测到glibc-双重自由或损坏,c++,free,glibc,C++,Free,Glibc,当我将代码(粘贴在下面)提交到在线gcc编译器时,我收到以下错误消息 *检测到glibc/run-1326102706-2046832693/解决方案:双重免费或损坏(!prev):0x091901a8**======= 代码如下: #包括 #包括 #包括 #包括 使用名称空间std; int main() { int测试用例,i,分数,str; 字符串str; 字符第一个字符,当前字符; 列表strlist; 列表::迭代器; cin>>测试案例; char*cstr[test_cases];

当我将代码(粘贴在下面)提交到在线gcc编译器时,我收到以下错误消息

*检测到glibc/run-1326102706-2046832693/解决方案:双重免费或损坏(!prev):0x091901a8**=======

代码如下:

#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
int测试用例,i,分数,str;
字符串str;
字符第一个字符,当前字符;
列表strlist;
列表::迭代器;
cin>>测试案例;
char*cstr[test_cases];//创建cstr指针数组(test_cases指针数)
而(测试用例>0)
{
cin>>str;
第一个字符=str.at(0);
str_len=str.length();
分数=str_len;
strlist.clear();
cstr[test_cases-1]=新字符[str_len];
strcpy(cstr[test_cases-1],str.c_str());//将输入str复制到cstr中。这样做是为了最小化std::string的at函数的复杂性。

对于(i=1;i您正在使用array new(“new char[str_len]”)来分配字符串,但使用scalar delete(“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\u len+1]
,因为
strcpy
复制终止符

另一个是:

    delete(cstr[test_cases-1]);

您不能使用
new[]
进行分配,也不能取消分配
delete
。如果使用
new[]
进行分配,则必须取消分配
delete[]
我可以看到两个问题:

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];

你试过运行valgrind吗?
c_str
方法的
string
可以用来从中获取
c-style
char数组。没有必要为此编写你自己的字符串类。用什么输入会导致崩溃?因为这是提交给topcoder类型的在线编译器-我无法控制编译器或输入。我可以尝试在本地计算机上运行它。可能是