将 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()};
}