首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存泄漏

内存泄漏
EN

Stack Overflow用户
提问于 2014-02-13 21:36:40
回答 2查看 695关注 1票数 2
代码语言:javascript
复制
int fromVectoEigen(vector<string> & source, double ** & array, int & n)
{  
    cout<<"n:"<<n<<'\n';
    int counter = 0;

    for (int j = n-1 ; j >= 0 ; j--) // iterate through each line
    {
        string mystring = source.back(); // take last line

        counter++;
        char * str = new char [mystring.length()+1];
        std::strcpy (str, mystring.c_str()); // copy string to char array
        char * pch; // pointer to tokens
        pch = strtok (str," ,-");
        for( int i = 0 ; i<3 ; i++) // dismiss first 3 columns
        {

            pch = strtok (NULL, " ,-");
        }

        for (int i= 0 ; i<n ; i++)
        {
            double val = atof(pch); // cast char to double

            //array[j][i]= val;
            //cout<<array[j][i]<<'\t';
            //pch = strtok (NULL, " ,-");
        }
        //
        //source.pop_back();

        }

    return 0;
}

嘿!

使用这个函数,我想从文件读取矩阵到二维数组,矩阵的行数和列一样多。我想用strtok把线按空间分开。这些行已经被读入另一个函数中的向量。(这起作用了)。所以我不知道这个问题,因为我试着用一个小的矩阵4列4行来运行它,它工作得很好!现在我想用一个很大的矩阵来试一试,它有超过1000行和同样多的列。我从val差尔那里得到了一条错误信息:

0x58A87AB:____strtod_l_internal (strtod_l.c:538) ==26501== by 0x4015BB: fromVectoEigen(std::vector >&,double**&,int&) (topo.cpp:70) ==26501== by 0x40362B: main (main.cpp:36) ==26501==地址0x0不是堆栈地址、malloc地址或(最近)免费地址

我尝试了注释/取消注释的方法,直到我使用atof....which为止,一切都很好,我不明白,因为它在小矩阵中工作得很好

大矩阵中的值如下所示: 0.11991517,与小测试矩阵一样,我只有0或0.1这样的值。

我希望我解释过,如果需要的话,enough...pls要求提供更多的细节。

EN

回答 2

Stack Overflow用户

发布于 2014-02-13 21:43:08

你分配str,但你从不释放它.有了你的代码,你永远也做不到。因此,每次调用此函数时,都会泄漏内存。

您应该在使用完delete [] str;后添加一个动态内存,或者根本不使用动态内存,继续使用std::string

此外,您可以避免整个转换问题,只需使用std::istream::operator>> (例如使用std::istringstream)来解析输入。

像这样的东西(未经测试)应该更适合你:

代码语言:javascript
复制
struct reader : std::ctype<char>
{
    reader() : std::ctype<char>(get_table()) {}

    static std::ctype_base::mask const* get_table()
    {
        static std::vector<std::ctype_base::mask> rc(table_size, std::ctype_base::mask());
        rc['\n'] = std::ctype_base::space;
        rc[','] = std::ctype_base::space;
        rc['-'] = std::ctype_base::space;
        rc[' '] = std::ctype_base::space;
        rc['\t'] = std::ctype_base::space;
        return &rc[0];
    }
};

int fromVectorEigen(const std::vector<std::string>& source, std::vector<std::vector<double>>& destination)
{
    reader rdr;
    std::for_each(source.rbegin(), source.rend(), [&](const std::string& s)
    {
        std::istringstream iss(s);
        iss.imbue(std::locale(), &rdr);
        std::string ignored_columns;
        double value;
        iss >> ignored_columns >> ignored_columns >> ignored_columns;
        std::vector<double> values;
        while (iss >> value)
        {
            values.push_back(value);
        }
        destination.push_front(values);
    });
    return 0;
}
票数 3
EN

Stack Overflow用户

发布于 2014-02-13 22:19:45

如果您希望保持当前的不使用流的设计,但消除内存的显式分配,则可以使用std::vector:

代码语言:javascript
复制
  #include <vector>
  //...
  std::vector<char> str(mystring.begin(), mystring,end());
  str.push_back(0);
  char * pch; // pointer to tokens
  pch = strtok (&str[0]," ,-");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21765999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档