C++ 检测到glibc-双重自由或损坏
当我将代码(粘贴在下面)提交到在线gcc编译器时,我收到以下错误消息 *检测到glibc/run-1326102706-2046832693/解决方案:双重免费或损坏(!prev):0x091901a8**======= 代码如下: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];
#包括
#包括
#包括
#包括
使用名称空间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类型的在线编译器-我无法控制编译器或输入。我可以尝试在本地计算机上运行它。可能是