读取二进制文件时C ++内存泄漏

时间:2016-11-12 01:01:11

标签: c++ file memory ifstream

我写的程序自动将压缩文件发送到服务器。 文件以弱VPS发送,处理具有1.5 GB的RAM。 当加载二进制文件获得微内存泄漏时,但是在30 000 .pdf拒绝继续分配内存。

我做了一个小小的欺骗,因为它保存了日志并再次运行程序,以这种方式清理RAM,但是,想知道原因。请注意,如果我不做'ios:binary',那么这样的泄漏就不会。

我的代码:

std::ifstream ifs(url,ios::binary);
    std::string content((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));
    content = PFHelper::stream_compression(content);
    content = PFHelper::ASE_encodeCppStandard(content,KS,PFHelper::AES_CBC_128);

PFHelper :: stream_compression

std::string PFHelper::stream_compression(std::string stream)
{
z_stream zs;                        // z_stream is zlib's control structure
memset(&zs, 0, sizeof(zs));

if (deflateInit(&zs, Z_BEST_COMPRESSION) != Z_OK)
{
    throw new PFException(L"EXCEPTION_DURING_ZLIB_COMPRESSION");
}

zs.next_in = (Bytef*)stream.data();
zs.avail_in = stream.size();           // set the z_stream's input

int ret;
char outbuffer[32768];
std::string outstring;

// retrieve the compressed bytes blockwise
do {
    zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
    zs.avail_out = sizeof(outbuffer);

    ret = deflate(&zs, Z_FINISH);

    if (outstring.size() < zs.total_out) {
        // append the block to the output string
        outstring.append(outbuffer,
            zs.total_out - outstring.size());
    }
} while (ret == Z_OK);

deflateEnd(&zs);

if (ret != Z_STREAM_END) { throw new PFException(L"EXCEPTION_DURING_ZLIB_COMPRESSION"); }
return outstring;
}

PFHelper :: ASE_encodeCppStandard

std::string PFHelper::ASE_encodeCppStandard(std::string in, wchar_t* KS ,wchar_t* typ)
{
string ctext = "";
std::string KS_string = PFHelper::ConvertFromUtf8ToString(KS);
if (typ == PFHelper::AES_CBC_128)
ctext = encrypt(KS_string,in);
if (typ == PFHelper::AES_CBC_256)
ctext = encryptEX(KS_string, in);

return ctext;
}
static string encrypt(string KS, const string ptext)
{

EVP_CIPHER_CTX* ctx;
ctx = EVP_CIPHER_CTX_new();
int rc = EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, (byte*)&KS[0], (byte*)&KS[0]);
if (rc != 1)
    throw runtime_error("EVP_EncryptInit_ex failed");

// Cipher text will be upto 16 bytes larger than plain text
std::string ctext;
ctext.resize(ptext.size()+16);
int out_len1 = (int)ctext.size();
rc = EVP_EncryptUpdate(ctx, (byte*)&ctext[0], &out_len1, (const byte*)&ptext[0], (int)ptext.size());
if (rc != 1)
    throw runtime_error("EVP_EncryptUpdate failed");

int out_len2 = (int)ctext.size() - out_len1;
rc = EVP_EncryptFinal_ex(ctx, (byte*)&ctext[0] + out_len1, &out_len2);
if (rc != 1)
    throw runtime_error("EVP_EncryptFinal_ex failed");

ctext.resize(out_len1 + out_len2);
return ctext;
}

0 个答案:

没有答案