简体   繁体   中英

C++ read memory faild

I have 2 classes:

class b_class
{
public:
    int time_viewed;
    int parent_course;

    b_class()=default;

    b_class(int parent_course):time_viewed(0), parent_course(parent_course){
    }
};

and:

class b_course
{
public:

    int course_id;
    int num_of_classes;
    b_class **classes;

    b_course(int course_id,int num_of_classes);
};

In the latter I wrote the following code:

b_course::b_course(int course_id,int num_of_classes) {
    this->course_id=course_id;
    this->num_of_classes=num_of_classes;
    classes=new b_class*[num_of_classes*sizeof(b_class*)];
    for (int i=0;i<num_of_classes;i++)
    {
        classes[i]->time_viewed=0;
        //classes[i]->parent_course=course_id;
    }
}

But I'm getting an error because I am trying to access some memory which shouldn't be accessed.

read memory from 0x7000000000000000 failed (0 of 4 bytes read)

anyone know what is the reason for this?

classes is an array of pointers to b_class

You are allocating an array of pointers that don't point at any valid objects. And you are allocating more space for the array then you actually need.

b_course::b_course(int course_id,int num_of_classes) {
    this->course_id = course_id;
    this->num_of_classes = num_of_classes;
    classes = new b_class*[num_of_classes]; // <- get rid of sizeof() here
    for (int i = 0; i < num_of_classes; i++)
    {
        classes[i] = new b_class(/*course_id*/); // <- add this
        classes[i]->time_viewed = 0;
    }
}

That being said, a better option is to allocate an array of objects instead of an array of pointers, eg:

class b_course
{
public:

    int course_id;
    int num_of_classes;
    b_class *classes;

    b_course(int course_id, int num_of_classes);
};

b_course::b_course(int course_id, int num_of_classes) {
    this->course_id = course_id;
    this->num_of_classes = num_of_classes;
    classes = new b_class[num_of_classes];
    for (int i = 0; i < num_of_classes; i++)
    {
        classes[i].time_viewed = 0;
        //classes[i].parent_course = course_id;
    }
}

Either way, since you are allocating objects dynamically, be sure to follow the Rule of 3/5/0 by also implementing a destructor to free the objects and array, and a copy constructor and copy assignment operator to make copies of the array and objects from one b_course to another.

The best way to handle all of this is to use a std::vector instead of new[] , and let the compile handle the details for you, eg:

#include <vector>

class b_course
{
public:

    int course_id;
    std::vector<b_class> classes;

    b_course(int course_id,int num_of_classes);
};

b_course::b_course(int course_id,int num_of_classes) {
    this->course_id=course_id;
    this->classes.resize(num_of_classes);
    for (int i=0;i<num_of_classes;i++)
    {
        classes[i].time_viewed=0;
        //classes[i].parent_course=course_id;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM