簡體   English   中英

以字符串形式返回char *數組->內存泄漏?

[英]returning a char* array as string -> memory leak?

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

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

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


    return message;
}

實際上,一切似乎都正常,但我不確定。

返回消息之前,我是否必須刪除/釋放消息變量? 還是轉換為字符串可以為我處理?

這是一個泄漏。

返回消息之前,我是否必須刪除/釋放消息變量?

是。

還是轉換為字符串可以為我處理?

不, std::string不擁有傳遞給其構造函數的指針的所有權。 (它無法知道它是否是new的。)

這可能會導致內存泄漏,或者在超出范圍的情況下崩潰。

message[messageSize] = '\\0'; 是非法的超出范圍的訪問權限,因此請將其刪除或更改為

if (messageSize > 0) message[messageSize - 1] = '\0';

或您想要並有效的東西。

然后,為避免內存泄漏,請在返回之前刪除字符串,否則指向分配的內存的指針將丟失。

std::string ret = message;
delete[] message;
return ret;

以這種方式傳遞從recv()讀取的數據而不進行檢查不是一個好主意,因為它可能不是以null終止的字符串。

很少需要管理自己的動態數組。 數組的面向對象管理方法是使用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()};
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM