Доступ к значению указателя после того, как указатель был удален - PullRequest
0 голосов
/ 03 ноября 2019

Итак, я студент, и у меня есть простое домашнее задание об основах C ++. До сих пор все работало нормально, но теперь у меня есть проблема, которую я не могу решить.

Классы, которые я написал, должны быть проверены основным методом, предоставленным профессором. Проблема в том, что он создает указатель на объект, затем удаляет указатель, но затем хочет напечатать объект. По какой-то причине это не работает с кодом, который я написал.

Возможно, я недостаточно разбирался в указателях, я узнал их на этом сайте: https://www.tutorialspoint.com/cplusplus/cpp_pointers.htm

Я думаю, что часть моегоПроблема также в методе «Добавить» (вы поймете, что я имею в виду). Глава этого метода дается профессором. Если я правильно понял, & args означает, что возвращает адрес.

Заранее извините, что мой код написан на немецком языке, но это не должно влиять на то, что вы, ребята, можете его понять. Также заранее извините, если я пропустил важные детали или не написал достаточно подробно, в чем заключается моя проблема или достаточно моего кода.

Любая помощь очень ценится!

Я действительно не знаючто делать, чтобы решить проблему.

-------------- Это код, предоставленный профессором -----------------

Мне не разрешено редактировать это

   int main(){
    Class1 Object1List[2];

    Class2  Object2.1= Class2(std::string("),...);  //all further parameters are strings
    Class2* Object2.2= new Class2(std:string(""),...);

    Class3  Object3.1 = Class3(std::string(""),...);
    Class3* Object3.2 = new Class3 (std::string(""),...);

    Object1List[0]=new Class1(Object3.1);
    Object1List[0]->Add(Object2.1);
    Object1List[0]->Add(*Object2.2);

    Object1List[1]=new Class1(Object3.2);
    Object1List[1]->Add(Object2.1);
    Object1List[1]->Add(*Object2.2);

    delete Object2.2;
    delete Object3.2;

    //for loop to print and afterwards delete both elements in Object1List
}

--------Class1--------------------------------
class Class1 {

    static const int maxEntries = 10;
    int m_numEntries=0;

    Class2 m_Class2;
    Class3* m_pList[maxEntries];
public:    
    Class1(Class2& objClass2);
    ~Class1();

    void Add(Class3& arg);
    void Print()const;
}
//cpp
  //constructor
this->m_Zeitschrift = zeitschrift;
//deconstructor sets all elements in the list to a nullptr

void Class1::Add(Class2& args){
    if(currentNumberOfEntries <=maxNumberOfEntries){
    currentNumberOfEntries++;
    class3List[currentNumberOfEntries] = &arg;
    }
}

//print
void Class1::Print(){
std::cout << "Class2: " << std::endl;
    m_Class2.Print();
    std::cout << "Class3list: " << std::endl;
    for (int i = 0; i < m_numEntries;i++) {
        m_pList[i]->Print();
    }
}

Я ожидаю, что метод print "просто" запишет вещи в список. Вместо этого он говорит мне, что не может печатать, вместо этого он говорит следующее (перевод с немецкого):

Брошенное исключение: «доступ для чтения (запрещено / ранен / ранен / не разрешен)» (lesezugriffsverletzung) std :: _ String_alloc>> :: _ Get_data (...) вернул 0xCDCDCDE9.

1 Ответ

0 голосов
/ 03 ноября 2019

Как было указано в комментариях, вы должны делать копию переданных элементов. Для этого вы можете использовать конструктор копирования.

void Class1::Add(Class2& arg){
  if(currentNumberOfEntries <=maxNumberOfEntries){
    currentNumberOfEntries++;
    class3List[currentNumberOfEntries] = new Class2(arg);
  }
}

Обязательно удалите элементы в вашем деструкторе.

Обратите внимание, что значение comaprison между currentNumberOfEntries и maxNumberOfEntries должно составлять <, а не <=.

Обратите внимание, что currentNumberOfEntries увеличивается перед назначением на основе индекса, поэтому последние две строки должны проверяться. обмениваться вот так:

void Class1::Add(Class2& arg){
  if(currentNumberOfEntries < maxNumberOfEntries){
    class3List[currentNumberOfEntries] = new Class2(arg);
    currentNumberOfEntries++;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...