728x90
반응형
리소스는 획득하고 나중에 해체해야 한다. new에 의해서 획득된 메모리나 fopen()에 의해 열리고 fclose()에 의해 닫힌 파일은 리소스에 대한 가장 직접적인 핸들이 포인터인 리소스의 예다. 이것은 포인터가 프로그램에 쉽게 전달되고 리소스를 소유한 포인터와 리소스를 소유하지 않은 포인터를 구별하는 유형 시스템이 없기 때문에 혼란스러울 수 있다.
void confused(int∗ p)
{
// delete p?
}
int global {7};
void f()
{
X∗ pn = new int{7};
int i {7};
int q = &i;
confused(pn);
confused(q);
confused(&global);
}
만약에 confused()가 p를 삭제하면 프로그램은 두 번째 두 호출에 대해 심각한 오류를 발생시킬 것이다. new에 의해 할당되지 않은 객체는 삭제할 수 없다. 만약에 confused()가 p가 삭제되지 않는다면 program leak이 된다. 이 경우에 분명 f()는 생성되는 객체의 수명을 관리해야 하지만 일반적으로 대규모 프로그램에서 삭제해야 하는 항목을 추적하려면 간단하고 일관된 전략이 필요하다.
일반적으로 리소스의 소유권을 나타내는 포인터를 즉시 배치하는 것(vector, string, unique_ptr과 같은 핸들 클래스)이 좋다. 그렇게 하면 리소스 핸들 내에 있지 않은 모든 포인터가 소유자가 아니며 삭제되어서는 안 된다고 가정할 수 있다.
728x90
반응형
'Program Language > C & C++' 카테고리의 다른 글
[C++] lvalue 참조 (0) | 2021.12.29 |
---|---|
[C++] 참조(references) (0) | 2021.12.29 |
[C++] Pointer & const (0) | 2021.12.29 |
[C++] 포인터(Pointer) (0) | 2021.12.23 |
[C++] 별칭 (0) | 2021.12.16 |