簡體   English   中英

C++ function 正在泄漏 memory,我是 ZF6F87C9FDCF8B3C9FDCF8B3C3F07F9C3F1 的新手,不確定如何修復

[英]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;
}

不要使用原始newdelete 每當您需要在 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.

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