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;
}
여기서 소멸자를 호출해서는 안됩니다.
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] 삭제
몇 마디 만하겠습니다