如何在 C++ 中删除 char* [重复]

Posted

技术标签:

【中文标题】如何在 C++ 中删除 char* [重复]【英文标题】:How to delete a char* in C++ [duplicate] 【发布时间】:2014-08-03 03:43:26 【问题描述】:

每次我执行这个...我都会收到一个错误:

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

我得到的错误是:

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

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

【问题讨论】:

两个错误——strcpy(var, "hola mundo"); 代替了assign,delete[] var; 代替了delete 你真的应该使用std::string。一个原因:你不能分配这样的字符串。对于 c 风格的字符串,你需要使用 strcpystrncpystrcatstrncat'。 “我不想使用 std::string 因为我在几个函数中使用 char* 作为参数” - 然后呢?你没听说过std::string::c_str() 方法吗? 嗯,std::string::c_str() 返回值是const char*,不允许修改(即使使用 const-cast,它也会破坏字符串内部结构,如长度和容量),所以它是并不总是一个替代品。 @keltar 然后&str[0]。这是可以修改的。 【参考方案1】:

当您有 var= "hola mundo\0"; 分配给编译器保留的内存中的字符串时。调用 delete 是未定义的行为。此外,原来的var 也有泄漏,因为它从来都不是deleted。 您应该使用strcpy 将您的字符串复制到var 或使用std::string 这样您就不必担心释放它。示例:std::string var = "hola mundo";

【讨论】:

对不起,由于参数化不使用字符串作为标准返回数据类型,但 char* 我需要销毁您在那里看到的内容...不使用字符串.. 无论如何谢谢!【参考方案2】:

当您将其他内容分配给 var 时,您从 new 收到的指针值会丢失。 var 的原始内容不见了。然后您尝试删除其他内容。

【讨论】:

哪里“消失”==“泄露” 是的...我知道..但我仍然想销毁分配给 var... 的文字...有什么想法吗? 不可能。它是您的 exe 文件的只读部分,就像您的程序代码一样。【参考方案3】:

首先,从字符串文字到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";

这样更简单、更安全。

【讨论】:

嗨,谢谢,我显然忘记了 [] :( 我的错,但正如我提到的,许多库使用 char* 而不是字符串来通过函数传递值,这些函数稍后需要被销毁!!!所以你在那些情况下不能使用字符串!!所以正如我在帖子中所说的那样......在现实生活中也是如此......我不能使用字符串......有什么想法吗? @DaWNFoRCe 您仍然可以使用std::string 来传递char* 数据,并管理由库填充的char* 缓冲区。如果您的意思是您编写了接受char* 的函数,并且这些函数需要释放传入的缓冲区,那么这可能会给std::string 带来问题,但出于多种原因,这也是一个坏主意。 对不起,但我不清楚我如何创建一个新的对象字符串类型.. 来破坏由 char 指向的那个。不,我不这样做。我正在调用返回字符的函数 ...然后我需要销毁它们,仅此而已... @DaWNFoRCe 哦,如果一个库正在分配字符串并且您无法控制分配,那么显然您需要执行库要求的任何操作才能解除分配字符串。当然,这是一个设计不佳的库,您仍然可以做一些事情。您应该立即将分配的内存交给智能指针。例如unique_ptr<char[]> buf(foo());,您甚至可能想立即将数据复制到更合理的类型,例如std::string。例如。 unique_ptr<char[]> buf(foo()); std::string copy = &buf[0];. 当然,如果库在进行分配,那么库必须告诉您如何正确解除分配。在 *** 上询问不会告诉您库需要什么。该库可能需要deletedelete[]custom_library_deallocator()free() 等。您必须阅读库文档。

以上是关于如何在 C++ 中删除 char* [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在c++的字符串中删除某个字符串

如何在c ++中删除嵌套列表中的重复元素

如何在 C 或 C++ 中以 O(n) 删除数组中的重复元素?

char数组如何存储在C++中?

如何使用 C++ 从字符串中删除元标记?

将'\'分配给char [重复]