将 char* 数组作为字符串返回 -> 内存泄漏?
returning a char* array as string -> memory leak?
std::string Client::listenForMessage()
{
// ... receiving message size ...
char* message = new char[messageSize];
message[messageSize] = '[=10=]';
// ...
... recv(connectedSocket, message, messageSize, 0);
// ...
return message;
}
实际上似乎一切正常,但我不确定。
在 return 之前,我是否必须 delete/free 我的消息变量?还是转换为字符串会为我处理?
可能会导致内存泄漏,或者写越界会崩溃
message[messageSize] = '[=12=]';
是非法越界访问,去掉或者改成
if (messageSize > 0) message[messageSize - 1] = '[=10=]';
或您想要的东西并且有效。
然后,为了避免内存泄漏,在返回之前删除字符串,否则指向已分配内存的指针将丢失。
std::string ret = message;
delete[] message;
return ret;
以这种方式在不检查的情况下传递从 recv()
读取的数据不是一个好主意,因为它可能不是以 null 结尾的字符串。
这是一个漏洞。
Do I have to delete/free my message variable before I return it?
是的。
Or does the conversion to string handle that for me?
不,std::string
不拥有传递给其构造函数的指针的所有权。 (它无法知道它是否 new
。)
很少需要管理自己的动态数组。管理数组的面向对象方法是使用 std::vector
class。它会为您完成所有 creating/deleting。
所以我会像这样使用 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()};
}
std::string Client::listenForMessage()
{
// ... receiving message size ...
char* message = new char[messageSize];
message[messageSize] = '[=10=]';
// ...
... recv(connectedSocket, message, messageSize, 0);
// ...
return message;
}
实际上似乎一切正常,但我不确定。
在 return 之前,我是否必须 delete/free 我的消息变量?还是转换为字符串会为我处理?
可能会导致内存泄漏,或者写越界会崩溃
message[messageSize] = '[=12=]';
是非法越界访问,去掉或者改成
if (messageSize > 0) message[messageSize - 1] = '[=10=]';
或您想要的东西并且有效。
然后,为了避免内存泄漏,在返回之前删除字符串,否则指向已分配内存的指针将丢失。
std::string ret = message;
delete[] message;
return ret;
以这种方式在不检查的情况下传递从 recv()
读取的数据不是一个好主意,因为它可能不是以 null 结尾的字符串。
这是一个漏洞。
Do I have to delete/free my message variable before I return it?
是的。
Or does the conversion to string handle that for me?
不,std::string
不拥有传递给其构造函数的指针的所有权。 (它无法知道它是否 new
。)
很少需要管理自己的动态数组。管理数组的面向对象方法是使用 std::vector
class。它会为您完成所有 creating/deleting。
所以我会像这样使用 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()};
}