std::string Client::listenForMessage()
{
// ... receiving message size ...
char* message = new char[messageSize];
message[messageSize] = '\0';
// ...
... recv(connectedSocket, message, messageSize, 0);
// ...
return message;
}
实际上一切似乎都很好,但我不确定。
在返回之前,是否必须删除/释放我的消息变量?或者转换为字符串是否适合我?
答案 0 :(得分:3)
这是泄密。
在退回之前,我是否必须删除/释放我的消息变量?
是
或者转换为字符串是否为我处理?
不,std::string
不接受传递给其构造函数的指针的所有权。 (没有办法知道它是否是new
'。)
答案 1 :(得分:2)
可能会导致内存泄漏,或者当您写出超出范围时可能会崩溃。
message[messageSize] = '\0';
是非法的超出范围访问权限,因此请将其删除或更改为
if (messageSize > 0) message[messageSize - 1] = '\0';
或您想要且有效的。
然后,为避免内存泄漏,请在返回之前删除字符串,否则指向已分配内存的指针将丢失。
std::string ret = message;
delete[] message;
return ret;
以这种方式传递从recv()
读取的数据而不进行检查不是一个好主意,因为它可能不是以空字符结尾的字符串。
答案 2 :(得分:2)
很少需要管理自己的动态数组。面向对象管理数组的方法是使用std::vector
类。它会为您完成所有创建/删除。
所以我会像这样使用std::vector
:
std::string Client::listenForMessage()
{
// ... receiving message size ...
// create a vector to manage the message array
std::vector<char> message(messageSize);
// ...
// use data() and size() methods
... recv(connectedSocket, message.data(), message.size(), 0);
// ...
// construct the returned string from the vector data
// The vector cleans itself up automatically
return {message.begin(), message.end()};
}