假设我有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;
}
答案 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;
}