C++坏内存分配异常

C++ bad memory alloc exception

本文关键字:异常 分配 内存 C++      更新时间:2023-10-16

以下是我要做的事情的要点。我将文件存储在SQL表中。该表很大,有400条记录,但每条记录都存储文件归档,每条记录的大小约为100MB。最近,我们不得不更改加密密钥。因此,我正在编写一个线程(5个线程)代码,使用旧密钥进行解密,然后使用新密钥进行加密。每个线程都是这样做的

struct DataToReencrypt
{
     int id;
     string data;
}
vector<DataToReencrypt> results;
// database open
SELECT ID,FileData From Files WHERE ID BETWEEN 1 AND 80 // 81-160 and so on.
// database connection close
// database connection open
for(int i=0;i<results.size();i++ )  // results contain the result of the above query.
{
    string decrypted = LegacyDecryption(results[i].FileData);
    string encrypted = NewEncryption(decrypted);
    UPDATE Files SET FileData = encrypted WHERE ID = results[i].ID;
}
// database connection close

问题是,当我尝试这样做时,我会得到这个C++bad_memory分配异常和SQL内存分配异常。当我读取bad_memory alloc异常时,当编译器无法分配新内存时,我读取C++会抛出它。以防万一,如果这有帮助的话,我正在一个6GB RAM的系统上运行它(我必须在6GB RAM中运行,因为这是我们产品支持的最低限度),当这个进程运行时,sqlserver.exe进程几乎占用了4GB的RAM空间。请帮助解决此方法的任何问题或任何可以改进的方法。

@TheDark在他的最后一条评论中给出了一个很好的建议。如果是我,并且我知道表中的计数,或者我可以检索数据计数,那么我会做类似于以下的事情:

// database connection open
for(int i=0;i<80;i++ )  // ...160...240...etc for each thread
{
    string data;
    SELECT ID,FileData From Files WHERE ID = i // 81-160 and so on.
    // data = FileData from query
    string decrypted = LegacyDecryption(data);
    string encrypted = NewEncryption(decrypted);
    UPDATE Files SET FileData = encrypted WHERE ID = i;
}
// database connection close

这将减少到目前为止使用的内存量,并使您自己摆脱该结构。当然,这意味着你的id是连续的,但我认为它们是连续的——因为你正在为这种特定类型的数据使用一个表。