[英]C++ function is leaking memory, I'm new to C++ and not sure how to fix it
我對 C++ 非常陌生,並且正在嘗試編譯程序,但是它正在泄漏 memory 和這部分代碼。
char* ReadString(u_int address, unsigned int size) {
char* data = new char[size];
for(int i=0; i < size; i++){
vm_readv(reinterpret_cast<void*>(address + (sizeof(char)*i)), reinterpret_cast<void*>(data + i), sizeof(char));
if(data[i] == '\0'){
break;
}
}
return data;
}
我不知道如何解決它。
我嘗試添加delete[] data;
break;
它停止 memory,程序也運行。 但我認為這可能會在某處使程序崩潰??
無論如何,我對如何正確處理泄漏感到困惑。
我一直在閱讀和使用智能指針可能是解決它的好方法,但同樣,我不知道如何正確打開char* data = new char[size];
在不破壞data[i]
的情況下放入指針。
編輯:嘗試停止泄漏,泄漏由此停止。 但我認為它可能會導致以后崩潰?
char* ReadString(u_int address, unsigned int size) {
char* data = new char[size];
for(int i=0; i < size; i++){
vm_readv(reinterpret_cast<void*>(address + (sizeof(char)*i)), reinterpret_cast<void*>(data + i), sizeof(char));
if(data[i] == '\0'){
delete [] data; // ------->>>>>>> Here
break;
}
}
return data;
}
不要使用原始new
和delete
。 每當您需要在 C++ 中創建 object 時,使用new
從來都不是好的做法。 如果您需要一個字符串,請使用std::string
。 它的 resize 方法可讓您調整其大小,而some_string[i]
可讓您訪問第 i 個字符。 我假設vm_readv
讀取單個字符,盡管我對void*
和reinterpret_cast
的使用有點困惑。
std::string ReadString(u_int address, unsigned int size) {
std::string result;
result.resize(size);
for (size_t i=0;i<size;++i) {
// read result[i]
// its address is &result[i]
}
return result;
}
在您的代碼中,泄漏不在 function 中,而是在 function 的調用者中。 因為 function 返回data
,它將所有權(=刪除它的責任)轉移給調用者。 不使用手動 memory 分配更簡單,更不容易出錯,如果您需要動態大小的字符串,管理 memory 的問題已經為您解決: std::string
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.