소멸자에서 누락 된 ptr = NULL로 인해 오류가 발생하고 ptr이 NULL로 설정된 경우 제대로 작동합니다. 왜?

Umar chaudhary

arr = 0;소멸자 정의 에서 줄 주석 을 달면 프로그램이 오류와 함께 종료됩니다. 해당 줄의 주석 처리를 제거하면 즉,가로 arr설정되어 0있으면 프로그램이 오류없이 실행됩니다. 포인터를 NULL로 설정할 필요가없는 이유입니다. 포인터 자체는 소멸자 실행 후 소멸됩니다.

오류 스크린 샷

아래는 내 코드입니다.

Array.h

#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리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관