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

POD 以外の型を割り当てるために使用するのは UB です。この場合、コンストラクターが呼び出さmallocれなかったため、本のインスタンスには文字列にガベージが含まれます。std::stringそして、それは単なるガベージ文字列ではなく、ランダムな場所を指しているガベージ ポインターである可能性が最も高いでしょう。手動でメモリを割り当てる必要がある場合は、 または を
使用して、新しいインスタンスをヒープに作成する必要があります。 そして、本当に を使用する必要がある場合は、配置を使用して、何らかの方法で割り当てた生メモリに有効な s を作成できます(あなたの場合は by)。std::vectornewBook
mallocnewstd::stringmalloc

于 2013-07-05T15:00:11.183 に答える
0

どうですか:

Book bookInfo[100];

これにより、ヒープ割り当てが完全に回避され、目的に役立つはずです。

于 2013-07-05T15:10:31.633 に答える