我有以下情况。以下程序,虽然它运行时编译得很好,但它会停止工作。有人可以帮我找到问题吗?我想我正在使用错误的指针进入函数,但我不知道如何解决它并让它工作
#include <fstream>
//some other includes
using namespace std;
struct Book{
string id;
string title;
string authorName;
string authorSurname;
};
int load(Book* booksInfo)
{
int count = 0;
ifstream fin;
fin.open("myfile.txt");
if (!fin.is_open())
{
cout << "Unable to open myfile.txt file\n";
exit(1);
}
while (fin.good())
{
getline(fin, booksInfo[count].id, '#');
getline(fin, booksInfo[count].title, '#');
getline(fin, booksInfo[count].authorName, '#');
getline(fin, booksInfo[count].authorSurname, '#');
count++;
} //end while
fin.close();
return 0;
} //end load()
//some other functions here
int main()
{
Book * bookInfo;
bookInfo = (Book*) malloc(sizeof(Book)*100);
//some code here
load(bookInfo);
//some code here
return 0;
} //end main
答案 0 :(得分:3)
使用malloc
来分配非POD类型是UB,在你的案例中,实例将在字符串中包含一些垃圾,因为没有调用std::string
构造函数。并且它不仅仅是垃圾字符串,它很可能是垃圾指针指向一些随机位置
如果确实需要手动分配内存,则应使用std::vector
或至少new
来在堆中创建新的Book
实例。
如果您确实必须使用malloc
,则可以使用展示位置new
在您以某种方式分配的原始内存中创建有效的std::string
(在您的情况下按malloc
)
答案 1 :(得分:3)
使用std::vector
存储您的图书清单:
#include <fstream>
#include <vector>
//some other includes
using namespace std;
struct Book{
string id;
string title;
string authorName;
string authorSurname;
};
vector<Book> load()
{
ifstream fin;
Book book;
vector<Book> books;
fin.open("myfile.txt");
if (!fin.is_open())
{
cout << "Unable to open myfile.txt file\n";
return books;
}
while (fin.good())
{
getline(fin, book.id, '#');
getline(fin, book.title, '#');
getline(fin, book.authorName, '#');
getline(fin, book.authorSurname, '#');
books.push_back(book);
} //end while
fin.close();
return books;
} //end load()
//some other functions here
int main()
{
vector<Book> books = load();
return 0;
} //end main
答案 2 :(得分:1)
您需要使用
Book* bookInfo = new Book[100];
代替。这是因为,在C ++中,struct
是一个对象(就像class
),并且在普通旧数据以外的任何内容上调用malloc是未定义的行为
请记住使用delete[] bookInfo;
释放你的记忆(仔细注意方括号)。如果你自己使用delete
,那就更多未定义的行为。
还要确保不要读超过100行;或者你将溢出数组:更多未定义的行为。
最后,请考虑使用标准模板库容器,如std::vector
。
答案 3 :(得分:0)
怎么样:
Book bookInfo[100];
这样可以完全避免堆分配,并且可以满足您的需要。