0

我有以下情况。以下程序虽然在我运行它时编译得很好,但它停止工作。谁能帮我找到问题?我想我在函数中使用了错误的指针,但我不知道如何修复它并使其工作

#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            
4

4 回答 4

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 
于 2013-07-05T15:03:25.577 回答
3

它是malloc用于分配非 POD 类型的 UB,在您的案例中,book 实例将在字符串中包含一些垃圾,因为没有std::string调用构造函数。而且它不仅仅是垃圾字符串,它很可能是指向一些随机位置的垃圾指针。如果您确实需要手动分配内存,
您应该使用std::vector或至少在堆中创建新实例。 如果你真的,真的必须使用,你可以使用placement在你以某种方式分配的原始内存中创建有效的s(在你的情况下)。newBook
mallocnewstd::stringmalloc

于 2013-07-05T15:00:11.183 回答
1

你需要使用

Book* bookInfo = new Book[100];

反而。这是因为,在 C++ 中, astruct是一个对象(就像 a 一样),并且在普通旧数据class之外的任何东西上调用 malloc都是未定义的行为

记得使用delete[] bookInfo;(注意方括号)释放你的内存。如果您delete自己使用它,那就是更多未定义的行为

还要确保您阅读的行数不超过 100 行;否则你会溢出数组:还有更多未定义的行为

最后,考虑使用标准模板库容器,例如std::vector.

于 2013-07-05T15:02:06.700 回答
0

关于什么:

Book bookInfo[100];

这完全避免了堆分配,应该可以满足您的目的。

于 2013-07-05T15:10:31.633 回答