删除指针后访问指针的值

时间:2019-11-03 10:13:06

标签: c++ pointers

因此,我是一名学生,我完成了有关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 :: _ St​​ring_alloc>> :: _ Get_data (...)返回0xCDCDCDE9。

1 个答案:

答案 0 :(得分:0)

正如注释中指出的那样,您应该复制传入的元素。为此,您可以使用副本构造函数。

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

请确保删除析构函数中的元素。

请注意,currentNumberOfEntries之间的同位格  并且maxNumberOfEntries应该是<,而不是<=

请注意,currentNumberOfEntries在基于索引的分配之前递增,因此最后两行应为prob。像这样交换:

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