【问题标题】:Acessing the value of a pointer after the pointer has been deleted删除指针后访问指针的值
【发布时间】:2019-11-03 10:13:06
【问题描述】:

所以我是一名学生,我有一个关于 C++ 基础的简单作业。到目前为止一切正常,但现在我遇到了一个我似乎无法弄清楚的问题。

我写的类需要在教授提供的main方法中进行测试。问题是,他创建了一个指向对象的指针,然后删除了该指针,但随后又想打印该对象。由于某种原因,这不适用于我编写的代码。

也许我对指针的理解不够,我是通过这个网站学习的: 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(...) 返回 0xCDCCDCDE9。

【问题讨论】:

  • 我不知道你的老师给你的确切任务,但大多数时候容器会创建存储元素的副本并负责管理它。您只是存储指向元素的指针,因此您的容器永远无法知道该元素是否还活着,它是否可以delete这个对象等等。
  • @Yksisarvinen 我认为这是一个很好的答案;)
  • @churill 假设太多,无法成为 IMO 的答案。标准容器像这样工作的事实并不意味着用户定义的容器必须这样做。我们需要minimal reproducible example 来正确回答这个问题:)
  • @Yksisarvinen 如果你这么认为 ^^ 确切的任务也会有所帮助。我的意思是描述应该如何实现Add
  • @lucieon 虽然在现代 c++ 中不推荐爱上指针 ;)

标签: c++ pointers


【解决方案1】:

正如 cmets 中所指出的,您应该复制传入的元素。为此,您可以使用复制构造函数。

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

请务必删除析构函数中的元素。

注意currentNumberOfEntries 之间的相互关系 maxNumberOfEntries 应该是 &lt; 而不是 &lt;=

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

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

【讨论】:

  • 啊,我明白了,谢谢!遗憾的是,这并没有完全修复错误(尽管我可以看到一个错误来源已被删除)。我上面提到的错误信息再次显示:“抛出异常:“读取访问(禁止/受伤/伤害/不允许)”(lesezugriffsverletzung)std::_String_alloc > >::_Get_data(...)返回0xCDCDCDE9。” (从德语翻译)如果我想再次打印列表,则会抛出此错误。所以由于某种原因,地址再次被保存,而不是 Class2 对象本身。
  • 还有一点更新:没关系,如果我在尝试打印之前或之后删除指针。
  • 那是代码没有显示,所以我不知道为什么这不起作用。
  • 好吧,我没有添加它,因为它只是一个非常简单的。但我在这里添加它(头部再次由教授给出): void Class2::Print const{ std::cout
  • 很难为您提供帮助,因为您没有提供最小的可重现示例。错误很可能在您的 class3List 的对象/内存管理中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
相关资源
最近更新 更多