由于未定义的行为导致程序崩溃

时间:2014-04-24 05:44:16

标签: c++

所以我正在编写一个程序,为一组CD创建一个库并显示它们。每当我将一个指向文件中的歌曲的指针数组写入这里显示的数组中的结构时,我的程序就会编译但崩溃:

//Get song array
        for (int a = 0; a < num_songs; a++)
            {

            getline (infile, line);
            sub = line.c_str();
            word = createString(sub);


            length = substr(word, -1, 5);
            title = substr(word, 5, strlen(sub));
            cd->song_array[a] = createSong(title,length);
            destroyString(word);

            }

我认为这是由于未定义的行为,这是发生这种情况的.cpp文件。

 #include <iostream>
#include "CDs.h"
#include "CD.h"
#include  <fstream>
#include <string>
#include <cstring>
using namespace std;

//Creates a collection of CDs
CDs* createCDs(const char* file_name)
{
//Declare variables and allocate memory
int max_cds = 50;
CDs* collection = new CDs;
collection->max_cds = max_cds;
CD** cd_array = new CD*[max_cds];

int num;
int sentinel = 0;
String* word;
string line;
CD* cd;
const char* sub;
String* length;
String* title;

//Open .txt file
ifstream infile;
infile.open(file_name);



if (infile.is_open())
    {
    while (infile.good())
        {   

        for (int i = 0; i < max_cds; i++)
            {

            //Get the artist from .txt file
            cd = cd_array[i];
            getline (infile, line);
            sub = line.c_str();
            word = createString(sub);  //Create string from infile line
            cd->artist = word;
            destroyString(word);


            //Get the Title of the album from file
            getline (infile, line);
            sub = line.c_str();
            word = createString(sub);
            cd->title = word;
            destroyString(word);

            //Get the Year of the album from file
            infile >> num;
            cd->year = num;

            //Get the Rating
            infile >> num;
            cd->rating = num;

            //Get number of tracks
            int num_songs;
            infile >> cd->num_tracks;

            //Get song array
            for (int a = 0; a < num_songs; a++)
                {

                getline (infile, line);
                sub = line.c_str();
                word = createString(sub);


                cout << "SHIT" << endl;
                length = substr(word, -1, 5);
                title = substr(word, 5, strlen(sub));
                cd->song_array[a] = createSong(title,length);
                destroyString(word);

                }

            cd_array[i] = cd;   
            sentinel++;


            }

        }
    }
else
    {
    cout << "file did not open";
    }

collection->cd_array = cd_array;
collection->num_cds = sentinel;
collection->max_cds = max_cds;
return collection;
}

我不知道如何做到这一点,如果有人可以帮助那将是惊人的。

编辑 - 我没有给出包含的.cpp并且使用了一些函数

    #include <iostream>
#include <cstring>
#include "String.h"
using namespace std;

//Function that creates a string
String* createString(const char* char_array)
{
//Allocate memory for a pointer to String struct
//String* string;
String* string = new String;

//Write the char_array to String struct
int length = strlen(char_array);

char array[30];
for (int i = 0; i <= length; i++)
    {
    array[i] = char_array[i];
    string->array[i] = array[i];
    }
return string;
}
//Function that displays the string
void displayString(String* str)
{
for (int i = 0; i < strlen(str->array); i++)
    {
    cout << str->array[i];
    }
cout << endl;
}

//Function that destroys the string
void destroyString(String* str)
{
delete str;
str = NULL;
}

int find(String* str, char delimiter, int start)
{
for (int i = start; i <= strlen(str->array); i++)
    {
    if (str->array[i] == delimiter) 
        {
        return i;
        }
    }
cout << "No occurences of delimiter were found" << endl;
return -1;
}

String* substr(String* str, int start, int end)
{
String* new_str = new String;
int count = 0;
for (int i = start + 1; i < end - 1; i++)
    {
    new_str->array[count] = str->array[i];
    count++;
    }

return new_str;
}

void compare(String* str1, String* str2)
{
if (str1->array < str2->array)
    {
    cout << str1->array << " is less than " << str2->array << endl;
    }
if (str1 > str2)
    {
    cout << str2->array <<" is less than " << str1->array << endl;
    }
if (str1 == str2)
    {
    cout << "The strings are equal" << endl;
    }
}

2 个答案:

答案 0 :(得分:0)

您永远不会为有效CD分配内存。您只需分配一个指向CD的指针数组(cd_array)。这意味着你有一个指针数组,指向未知的内存位置。

确保不存在此类错误访问的最佳方法是不动态分配内存。只需使用CD cd_array [max_cds]并使用它。 (如果需要将其传递给函数,请使用引用调用。)

答案 1 :(得分:0)

您需要添加以下行:

    //Get the artist from .txt file 
           cd_array[i] = new CD; 
           cd = cd_array[i];
           .....

完成使用后,您应该取消分配内存

for(...)
 delete cd_array[i];

delete []cd_array;