将字符串元素分配给结构数组中的结构

时间:2017-01-26 15:34:24

标签: c++ arrays csv struct

我正在编写一个从csv文件中读取各种属性(包括字符串)的函数,并将其分配给结构的相关元素,该结构恰好位于类似结构的数组中。

每当我尝试将值赋值给:

materialLookup[v-1].name 
程序崩溃了。

MaterialL 

是一个带有string元素的结构,名为name,如下所示:

    struct MaterialL {
    string name;
    double sigma;
    double corLength;
    double mu;
    double muPrime;
    double ep;
    double epPrime;
};

我已经检查过我正在正确地从csv文件中读取string,在这种情况下,它是&#34; Drywall&#34;。在我能够在下一行cout<<"hey";之前,程序总是崩溃。我唯一的想法是,因为程序在我分配它之前并不知道string的大小,所以它不会为它留下任何记忆。如果是这样,我怎么能纠正这个?

   unsigned int getMatLookUp(string filename)
{
    int nLines = getNumOfLines(filename);
    cout << nLines;
    materialLookup = (MaterialL*)alignedMalloc(nLines * sizeof(MaterialL));
    ifstream file(filename);
    int v = 0;
    string value;

    if (file.is_open() && fileExists(filename))
    {
        //flush title line
        for (int p = 0; p < 6; p++){ std::getline(file, value, ',');  }std::getline(file, value);
        v++;
        //get all the materials
        while (v < nLines -1)
        {
            std::getline(file, value, ',');
            cout << value<<"\n\n";
            materialLookup[v - 1].name = value;
            cout << "hey";
            std::getline(file, value, ',');
            cout << value << "\n\n";
            materialLookup[v - 1].sigma = stod(value);
            std::getline(file, value, ',');
            materialLookup[v - 1].corLength = stod(value);
            std::getline(file, value, ',');
            materialLookup[v - 1].mu = stod(value);
            std::getline(file, value, ',');
            materialLookup[v - 1].muPrime = stod(value);
            std::getline(file, value, ',');
            materialLookup[v - 1].ep = stod(value);
            std::getline(file, value);
            materialLookup[v - 1].epPrime = stod(value);
            v++;
        }
        file.close();
    }
    else
    {
        cout << "Unable to open file when loading material lookup in function getMatLookUp press enter to continue\n";
        cin.get();
    }
    return(0);
}

1 个答案:

答案 0 :(得分:2)

问题很可能是alignedMalloc使用malloc来分配内存而不是new

虽然mallocnew都分配内存,但new运算符会执行malloc不执行的操作:调用构造函数。

如果name对象未构建,则它基本上处于无效状态,并以任何方式使用它将导致未定义的行为

如果您继续坚持使用malloc或使用new[]分配字节数组,那么解决方法是使用 placement new 构建{{ 1}}对象到位:

name