C++ istringstream()(可能)内存泄漏

C++ istringstream()(可能)内存泄漏,c++,file,memory-management,readfile,istringstream,C++,File,Memory Management,Readfile,Istringstream,假设要将数据从大文本文件(~300mb)读取到向量数组:vector*data(假设列数已知) 完整的编译就绪代码(添加标题): int-tmain(int-argc,_-TCHAR*argv[] { 流测试文件; 打开(“testdata.txt”); srand(时间(空)); 对于(inti=1;i我严重怀疑这不是istringstream问题(特别是,假设您在循环外使用iLine构造函数得到相同的结果) 这可能是std::vector的正常行为。要测试这一点,请运行完全相同的行,但注释掉

假设要将数据从大文本文件(~300mb)读取到向量数组:
vector*data
(假设列数已知)

完整的编译就绪代码(添加标题):

int-tmain(int-argc,_-TCHAR*argv[]
{
流测试文件;
打开(“testdata.txt”);
srand(时间(空));

对于(inti=1;i我严重怀疑这不是istringstream问题(特别是,假设您在循环外使用iLine构造函数得到相同的结果)

这可能是std::vector的正常行为。要测试这一点,请运行完全相同的行,但注释掉:
Data[i]。向后推(u);
。查看内存是否以这种方式增长。如果没有,则您知道问题出在何处

根据您的库,vector::push_back将其容量扩展1.5倍(Microsoft)或2倍(glib)每次它都需要更多的空间。

vector
以几何方式增长内存。一种典型的模式是,每当它需要增长时,它的容量就会翻倍。如果循环刚好在这样一个阈值之后结束,这可能会留下大量额外的已分配空间,但未使用。您可以尝试调用
shrink_to_fit()
完成后,在每个向量上

另外,由C++分配器(甚至是普通代码> MalCube()/代码>分配的内存通常不返回到OS,而是留在进程内部空闲内存池中,这可能导致进一步的明显增长,并且可能导致代码“> SyryToToFIX())/<代码>的结果在进程之外是不可见的。 最后,如果有很多小字符串(“2位数字”),则

字符串
对象的开销可能相当大。即使实现使用小字符串优化,我也会假设典型字符串使用不少于16或24个字节(大小、容量、数据指针或小字符串缓冲区)-在
size\u type
为64位的平台上可能更大。对于3字节的有效负载来说,这是一个很大的内存


所以我假设你看到的是
向量的正常行为

真正的问题是为什么你要为每一行使用一个单独的
向量
?为什么你不直接使用你的
ifstream
?为什么你要
新建
你的
向量
?1.我为每一列使用单独的向量。行读取的行为是相似的ar(我检查过)我认为更真实(这是一个词吗?)问题是,既然您使用的是vector,它是手动管理动态数组的替代品,为什么您要创建一个动态向量数组而不是向量数组?嗯……这对我来说很有意义,但是:1.内存增长太快,以至于在循环完成之前引发异常,所以我无法缩小向量2.2位数字的大小例如,我需要用测试代码处理任何输入原子类型,如果调用
Data[I].reserve(1000000);
为每个向量(利用您知道将有9999999行输入的事实),它是否会改变任何东西(更快失败,更晚失败,永不失败)是的,你是对的…它甚至在为所有向量分配这么多内存的阶段都失败了…你知道我的任务的替代解决方案吗?最有效的内存使用方法是将所有文件内容加载到一个字符数组中,并使用与
strtok()相当的东西
将其分解为适当的单词。然后,列向量将是
向量
。这是假设您需要同时以文本形式存储内存中的所有数据。@user2028058:这取决于您的任务是什么。将数据读入内存当然不是任务,而是达到目的的一种方法。那么,您到底想用这些数据做什么呢?
//file is opened with ifstream; initial value of s is set up, etc...


Data = new vector<string>[col];
string u;
int i = 0;

do
{       
    istringstream iLine = istringstream(s);

    i=0;
    while(iLine >> u)
    {
        Data[i].push_back(u);
        i++;
    }
}
while(getline(file, s));
for(long i=0;i<col;i++)
    Data[i].clear();
delete []Data;
int _tmain(int argc, _TCHAR* argv[])
{
ofstream testfile;
testfile.open("testdata.txt");

srand(time(NULL));

for(int i = 1; i<1000000; i++)
{
    for(int j=1; j<100; j++)
    {
        testfile << rand()%100 << " ";
    }

    testfile << endl;
}

testfile.close();

vector<string> *Data;

clock_t begin = clock();

ifstream file("testdata.txt"); 

string s;

getline(file,s);

istringstream iss = istringstream(s);

string nums;

int col=0;

while(iss >> nums)
{
    col++;
}

cout << "Columns #: " << col << endl;

Data = new vector<string>[col];

string u;
int i = 0;

do
{

    istringstream iLine = istringstream(s);

    i=0;

    while(iLine >> u)
    {
        Data[i].push_back(u);
        i++;

    }

}
while(getline(file, s));

cout << "Rows #: " << Data[0].size() << endl;

for(long i=0;i<col;i++)
        Data[i].clear();
    delete []Data;

clock_t end = clock();

double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;

cout << elapsed_secs << endl;

getchar();
return 0;
}