如何在C ++中分配和返回没有内存泄漏的字符串?

时间:2015-01-29 21:46:50

标签: c++ memory-leaks return-value

假设我有3个功能:

int A(void); 
string B(const string& fileName); 
void C(string& dataFromFile);

A()调用B()并使用B()的返回值作为C()的输入参数。在这种情况下,我想在B()中打开文件,并将文件中写入的数据读取到缓冲区。然后我想将这些数据作为字符串返回。如何实现B()以避免内存泄漏?因为下面的伪代码会导致内存泄漏。

string B(const string& fileName) {
    // open file 
    char* buffer = new char[sizeOfFile];
    // read from file and assogn the data to buffer
    return buffer;
}

3 个答案:

答案 0 :(得分:1)

你可以使用std :: string来避免任何泄漏。

std::string B(const std::string& fileName)
{
std::string buffer;
// open file
buffer.reserve(sizeOfFile);
// do stuff
return buffer;
}

编辑:使用保留预先分配所需内存的保留和return value optimization与char *相比,这不应该有巨大的性能损失。

答案 1 :(得分:0)

跳过中间人。从字符串开始,读入字符串,然后返回字符串。我不确定您使用哪些功能来阅读您的数据,但无论您使用char*做什么,都可以使用std::string。例如,如果您使用read的{​​{1}}函数,则可以执行以下操作:

ifstream

答案 2 :(得分:-1)

将功能更新为:

string B(const string& fileName) {
    // open file 
    char* buffer = new char[sizeOfFile];
    // read from file and assogn the data to buffer

    string ret(buffer);
    delete [] buffer;
    return ret;
}

如果您可以使用string代替char*,那么它会更好。

string B(const string& fileName) {
    // open file 

    strin ret(sizeOfFile, `\0');
    // read from file and assogn the data to ret

    return ret;
}