在析构函数中缺少ptr = NULL导致错误,将ptr设置为NULL可以正常工作。为什么?

乌玛·乔杜里(Umar Chaudhary)

如果我arr = 0;在析构函数定义中注释该行,则该程序将终止并显示错误。如果我取消注释该行,即arr设置为0,则程序执行无任何错误。为什么这样做,因为不需要将指针设置为NULL。指针本身在执行析构函数后被销毁。

错误的屏幕截图

下面是我的代码。

数组

#ifndef ARRAY_H
#define ARRAY_H
class Array
{
    int* arr;
    int size;
public:
    Array(int size = 10);
    Array(const Array& arr);
    ~Array();
    void display () const;
};
#endif

Array.cpp

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

Array::Array(int size)
{
    arr = new int[size];
    this->size = size;
    for (int i = 0; i < size; i++)
        arr[i] = i;
}

Array::Array(const Array& a)
{
    arr = new int[a.size];
    for (int i = 0; i < a.size; i++)
        arr[i] = a.arr[i];
    size = a.size;
}

Array::~Array()
{
    delete[] arr;
    arr = 0;
}

void Array::display() const
{
    cout << endl;
    for (int i = 0; i < size; i++)
        cout << arr[i] << " ";
    cout << endl;
}

Main.cpp

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

int main()
{
    Array arr(4);
    Array a1 = arr;
    a1.display();
    arr.~Array();
    a1.display();

    return 0;
}
juanchopanza

您不应该在这里调用析构函数:

arr.~Array();

arr超出范围时,析构函数将被第二次调用。delete[]在指针数据成员上调用时,将导致未定义的行为arr当您将其设置0为时,您可以绕开问题,但事实是您不应该这样调用析构函数。

这是一个示例,显示自动存储对象的生存期如何与其范围绑定:

#include <iostream>

struct Foo
{
  ~Foo() { std::cout << "Foo destructor\n";
};

int main()
{
  std::cout << in main()\n";

  {
    Foo f;
  }  // f gets destroyed here

  std::cout << "Exiting main()\n";
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

unique_ptr析构函数的优势

来自分类Dev

为什么std :: shared_ptr从基类和派生类中调用析构函数,而delete仅从基类中调用析构函数?

来自分类Dev

当我可以在析构函数中销毁对象时,为什么还要使用std :: unique_ptr?

来自分类Dev

从未调用过的shared_ptr对象的析构函数

来自分类Dev

DAG析构函数中的错误

来自分类Dev

在OpenCV中,什么是VideoCapture析构函数

来自分类Dev

尽管类型在析构函数中完全合格,但std :: auto_ptr会导致崩溃和泄漏

来自分类Dev

尽管类型在析构函数中完全合格,但std :: auto_ptr会导致崩溃和泄漏

来自分类Dev

如果析构函数用于向量中的对象,是否将调用该析构函数?

来自分类Dev

通过类析构函数中的重置成员shared_ptrs解决C ++ 11 shared_ptr循环参考?

来自分类Dev

为什么在Friend函数中调用析构函数

来自分类Dev

为什么在使用unique_ptr时没有调用析构函数?

来自分类Dev

为什么std :: shared_ptr两次调用我的析构函数?

来自分类Dev

零除在虚拟析构函数中工作正常

来自分类Dev

为什么在Delphi中命名析构函数?

来自分类Dev

基类中的非虚拟析构函数,但派生类中的虚拟析构函数导致分段错误

来自分类Dev

在其自己的析构函数中移动unique_ptr可以吗?

来自分类Dev

如果未使用shared_ptr定义虚拟析构函数,有什么好处?

来自分类Dev

如果A有析构函数,std :: unique_ptr <A>什么时候需要特殊的删除器?

来自分类Dev

是否可以在C ++中自动生成析构函数?

来自分类Dev

可以访问析构函数中的静态成员的静态对象

来自分类Dev

可以在析构函数中清除向量吗

来自分类Dev

类中析构函数定义的Collect2错误

来自分类Dev

反向链接列表时,析构函数中的内存错误

来自分类Dev

std :: vector析构函数中的分段错误

来自分类Dev

简单 LinkedList 程序中的析构函数段错误

来自分类Dev

析构函数如何工作?

来自分类Dev

什么是std :: ios :: exceptions在析构函数中的预期行为?

来自分类Dev

什么是C ++ 20中的“预期析构函数”?

Related 相关文章

  1. 1

    unique_ptr析构函数的优势

  2. 2

    为什么std :: shared_ptr从基类和派生类中调用析构函数,而delete仅从基类中调用析构函数?

  3. 3

    当我可以在析构函数中销毁对象时,为什么还要使用std :: unique_ptr?

  4. 4

    从未调用过的shared_ptr对象的析构函数

  5. 5

    DAG析构函数中的错误

  6. 6

    在OpenCV中,什么是VideoCapture析构函数

  7. 7

    尽管类型在析构函数中完全合格,但std :: auto_ptr会导致崩溃和泄漏

  8. 8

    尽管类型在析构函数中完全合格,但std :: auto_ptr会导致崩溃和泄漏

  9. 9

    如果析构函数用于向量中的对象,是否将调用该析构函数?

  10. 10

    通过类析构函数中的重置成员shared_ptrs解决C ++ 11 shared_ptr循环参考?

  11. 11

    为什么在Friend函数中调用析构函数

  12. 12

    为什么在使用unique_ptr时没有调用析构函数?

  13. 13

    为什么std :: shared_ptr两次调用我的析构函数?

  14. 14

    零除在虚拟析构函数中工作正常

  15. 15

    为什么在Delphi中命名析构函数?

  16. 16

    基类中的非虚拟析构函数,但派生类中的虚拟析构函数导致分段错误

  17. 17

    在其自己的析构函数中移动unique_ptr可以吗?

  18. 18

    如果未使用shared_ptr定义虚拟析构函数,有什么好处?

  19. 19

    如果A有析构函数,std :: unique_ptr <A>什么时候需要特殊的删除器?

  20. 20

    是否可以在C ++中自动生成析构函数?

  21. 21

    可以访问析构函数中的静态成员的静态对象

  22. 22

    可以在析构函数中清除向量吗

  23. 23

    类中析构函数定义的Collect2错误

  24. 24

    反向链接列表时,析构函数中的内存错误

  25. 25

    std :: vector析构函数中的分段错误

  26. 26

    简单 LinkedList 程序中的析构函数段错误

  27. 27

    析构函数如何工作?

  28. 28

    什么是std :: ios :: exceptions在析构函数中的预期行为?

  29. 29

    什么是C ++ 20中的“预期析构函数”?

热门标签

归档