[英]In C++ does returning a string created from a local char array cause a memory leak or undefined behavior?
[英]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.