객체 생성 :`new`의 유무에 관계없이
이것은 아마도 기본적인 질문 일 수 있으며 이미 요청되었을 수도 있습니다 (예 : here ). 그러나 나는 여전히 그것을 이해하지 못한다. 그래서 물어 보도록하겠습니다.
다음 C ++ 클래스를 고려하십시오.
class Obj{
char* str;
public:
Obj(char* s){
str = s;
cout << str;
}
~Obj(){
cout << "Done!\n";
delete str; // See the comment of "Loki Astari" below on why this line of code is bad practice
}
};
다음 코드 스 니펫의 차이점은 무엇입니까?
Obj o1 ("Hi\n");
과
Obj* o2 = new Obj("Hi\n");
전자는 왜 소멸자를 호출하지만 후자는 그렇지 delete
않습니까?
어느 것이 선호됩니까?
둘 다 다른 일을합니다.
첫 번째는 자동 저장 기간 이있는 객체를 만듭니다 . 현재 블록 ( { ... }
)이 종료 되면 생성되고 사용 된 다음 범위를 벗어 납니다. 객체를 생성하는 가장 간단한 방법이며, 글을 쓸 때와 동일합니다.int x = 0;
두 번째는 동적 저장 시간을 갖는 객체를 생성하고 다음 두 가지를 허용합니다.
자동으로 범위를 벗어나지 않기 때문에 객체의 수명을 정밀하게 제어합니다. 키워드를 사용하여 명시 적으로 삭제해야합니다
delete
.객체 생성은 런타임에 발생하므로 런타임에만 알려진 크기의 배열을 생성합니다. (여기서 동적 배열 할당에 대해서는 다루지 않겠습니다.)
어느 쪽도 바람직하지 않습니다. 그것은 당신이하고있는 일에 가장 적합한 것에 달려 있습니다.
후자를 사용할 필요가 없으면 전자를 사용하십시오.
C ++ 책은 이것을 잘 다루어야합니다. 당신이 하나가없는 경우, 당신이 구입하고 이들 중 하나를 여러 번 읽을 때까지 더 이상 가지 마십시오 .
행운을 빕니다.
그것으로 원래 코드는 고장 delete
이야 char
은하지 않았다 배열을 new
. 실제로 C 스타일 문자열에는 아무것도 없습니다 new
. 문자열 리터럴에서 나왔습니다. delete
이는 오류입니다 (컴파일 오류를 생성하지는 않지만 런타임시 예측할 수없는 동작 임).
일반적으로 객체는 delete
그 자체가 아닌 것에 대해 책임을 지지 않아야합니다 new
. 이 동작은 잘 문서화되어야합니다. 이 경우 규칙이 완전히 깨졌습니다.
첫 번째는 자동 저장 기간이있는 객체를 할당합니다. 즉, 객체가 정의 된 범위를 벗어나면 자동으로 소멸됩니다.
두 번째는 동적 저장 시간이있는 객체를 할당 delete
했으므로 명시 적으로 사용 하기 전에는 객체가 삭제되지 않습니다 .
참고 URL : https://stackoverflow.com/questions/6337294/creating-an-object-with-or-without-new
'IT박스' 카테고리의 다른 글
PyLint 메시지 : logging-format-interpolation (0) | 2020.07.17 |
---|---|
C #에서 문자열 인코딩 결정 (0) | 2020.07.17 |
CSS를 사용하여 표 셀에서 오른쪽 정렬 (0) | 2020.07.17 |
WCF 서비스 응용 프로그램과 WCF 서비스 라이브러리의 차이점은 무엇입니까? (0) | 2020.07.17 |
JMS 및 AMQP-RabbitMQ (0) | 2020.07.17 |