如何在 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 风格的字符串,你需要使用 strcpy
或 strncpy
或 strcat
或 strncat
'。
“我不想使用 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,则不应直接使用 new
和 delete
。在早期版本的 C++ 中,在许多情况下您仍然可以避免使用 new
和 delete
。在这种情况下,因为已经有一个 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];
.
当然,如果库在进行分配,那么库必须告诉您如何正确解除分配。在 *** 上询问不会告诉您库需要什么。该库可能需要delete
、delete[]
、custom_library_deallocator()
、free()
等。您必须阅读库文档。以上是关于如何在 C++ 中删除 char* [重复]的主要内容,如果未能解决你的问题,请参考以下文章