如何在C ++中删除char *

时间:2014-06-12 17:48:01

标签: c++ arrays pointers char delete-operator

每次执行此操作时......都会出错:

char * var= new char[256];
var= "hola mundo\0";
delete var;

我得到的错误是:

  

malloc:***对象0x10007fd20的错误:释放的指针未分配
  ***在malloc_error_break中设置一个断点

我不想使用std :: string或std :: vector ...因为我在几个函数中使用char *作为参数,我希望能够销毁它。

3 个答案:

答案 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,则不应直接使用newdelete。在早期版本的C ++中,在许多情况下,您仍然可以避免使用newdelete。在这种情况下,由于已经有std::string类型,因此无论您使用何种版本的C ++,都应该使用它。您的三行代码应替换为:

std::string var = "hola mundo";

这更简单,更安全。