每次执行此操作时......都会出错:
char * var= new char[256];
var= "hola mundo\0";
delete var;
我得到的错误是:
malloc:***对象0x10007fd20的错误:释放的指针未分配
***在malloc_error_break中设置一个断点
我不想使用std :: string或std :: vector ...因为我在几个函数中使用char *作为参数,我希望能够销毁它。
答案 0 :(得分:4)
当你有var= "hola mundo\0";
分配给内存中编译器保留的字符串时。在此上调用delete
是未定义的行为。此外,原始var
也有泄漏,因为它永远不会deleted
。
您应该使用strcpy
将字符串复制到var
或者使用std::string
,这样您就不必担心会释放它。示例:std::string var = "hola mundo";
答案 1 :(得分:3)
当您为var指定其他内容时,您从new收到的指针值将丢失。 var的原始内容消失了。然后你试图删除其他东西。
答案 2 :(得分:1)
首先,从字符串文字到char*
变量的赋值不会将字符串数据复制到您分配的内存中。相反,它只是重新指定指针,以便var
不再指向您分配的内存。这意味着您分配的内存丢失并且从未正确解除分配,这意味着您使用delete
使用了您从未分配的指针,这是无效的。
其次,您使用new char[]
分配数组,因此您需要使用delete []
而不是delete
。
第三,字符串文字自动包含空终止符,因此您不需要添加额外的字符串:
var = "hola mundo";
最后,如果您可以使用C ++ 11或C ++ 14,则不应直接使用new
和delete
。在早期版本的C ++中,在许多情况下,您仍然可以避免使用new
和delete
。在这种情况下,由于已经有std::string
类型,因此无论您使用何种版本的C ++,都应该使用它。您的三行代码应替换为:
std::string var = "hola mundo";
这更简单,更安全。