将char *数组作为字符串返回 - >内存泄漏?

时间:2016-03-16 00:40:05

标签: c++ arrays string winsock

std::string Client::listenForMessage()
{
    // ... receiving message size ...

    char* message = new char[messageSize];
    message[messageSize] = '\0';

    // ...
       ... recv(connectedSocket, message, messageSize, 0);
    // ...


    return message;
}

实际上一切似乎都很好,但我不确定。

在返回之前,是否必须删除/释放我的消息变量?或者转换为字符串是否适合我?

3 个答案:

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