传递给std::string()后,我需要释放字符缓冲区吗?

3
我是一名Java程序员,对于C / C ++编程只有一天的经验。我正在尝试从char *创建std :: string。
这是我的字符缓冲区 -
char* token = (char*) malloc ((numberOfCharacters) * sizeof (char));

以下是我创建 std::string 对象的方法 -

std::string strKey (token); 

但是在这个调用之后,我需要释放“token”吗?或者strKey指向的是由token指向的字符缓冲区?


6
“C/C++编程”这个说法是不存在的。C语言与C++语言不兼容,需要选择其中一种语言。在C++程序中使用malloc通常是一个非常糟糕的想法。 - Lundin
@StefanoSanfilippo:我理解C语言中的第一行,自从C11以来,可变长度数组是可选的。这是选择一种语言的另一个原因。 - too honest for this site
2
@Mayur,听起来你可以仅使用std::string完成所有操作。也许你最好发布一个关于你想要实现的问题,而不是一个关于你在“错误”的解决方案上遇到的技术障碍的问题?当然,展示你已经得到的解决方案是可以的,这将鼓励人们帮助你思考改进,而不是把你的问题视为“请替我编写代码”。 - Andrew
1
@Andrew:优秀的程序员是懒惰的程序员(不是双射的:-)。 - too honest for this site
1
@Mayur,在你继续尝试编写C++代码之前,先找一本好的C++书籍来读一下。这里可以找到一些好的推荐:https://dev59.com/_3RC5IYBdhLWcg3wK9yV?lq=1。使用std::string做你想做的事情并不难,但你需要先学会如何使用C++和标准容器。 - Rob K
显示剩余12条评论
3个回答

6

std::string的构造函数会复制token,但不会拥有它。因此,在构建strKey后,您需要使用free()释放它。

无论如何,在C++代码中应该使用newdelete运算符:

char *token = new char[numberOfCharacters];

//...

std::string strKey(token);
delete[] token;

//...

除非你有特定的原因,否则不要使用C语言中的mallocfree函数。


3

如果您不打算再使用 token,那么是的,您必须释放它。String 的构造函数不能自动猜测您想要释放它。

您还应该检查确保 malloc() 成功; malloc() 返回 NULL 表示错误状态。

此外,sizeof(char) 总是1。


3
如果你使用了malloc,你需要使用free。如果你将指针传递给另一个对象进行管理(请参见Stefano的评论),则free可以由该对象进行管理。但是在这里,由于你自己管理指针,当不再需要它时,必须释放它。
而在C++中,如果没有被强制要求,应尽量避免使用malloc。因为malloc更适用于C语言。

2
这是正确的,但有点太笼统了,无法回答OP的具体问题。顺便说一下,我没有点踩... - alk
1
虽然这不是最详细的答案,但事实上它并没有任何通俗易懂的东西。它直接回答了中心问题,而没有多余的修饰。 - ryyker
1
@ryyker 这是确实正确的,但它没有详细说明是谁执行了 free 操作。如果 std::string 获取指针的所有权,则其析构函数将执行 delete,而不是直接由用户执行。在这种情况下释放 token 将导致双重释放错误。 - Stefano Sanfilippo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接