繁体   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