我正在编写一个从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);
}
答案 0 :(得分:2)
问题很可能是alignedMalloc
使用malloc
来分配内存而不是new
。
虽然malloc
和new
都分配内存,但new
运算符会执行malloc
不执行的操作:调用构造函数。
如果name
对象未构建,则它基本上处于无效状态,并以任何方式使用它将导致未定义的行为。
如果您继续坚持使用malloc
或使用new[]
分配字节数组,那么解决方法是使用 placement new 构建{{ 1}}对象到位:
name