간단하게 말하자면 "당연합니다." 이지만, 이 질문에서 자주 나오는 예시들을 보세요.
void f()
{
X* p = new X;
// use p
}
즉, new를 통해 생성된 객체가 함수의 끝에서 파괴 될 것이라는 틀린 가정이었습니다.
기본적으로, 객체를 생성한 스코프의 수명이 지나서 살아야 하는 경우에만 new를 사용해야합니다. 이것이 끝나게 된다면, delete로 파괴해야 합니다. 예를 들자면 :
X* g(int i) { /* ... */ return new X(i); } // the X outlives the call of g()
void h(int i)
{
X* p = g(i);
// ...
delete p;
}
만약 스코프에서만 오브젝트가 살아있게 하고싶다면, new를 사용하지 말고 단단하게 변수만 정의하세요:
{
ClassName x;
// use x
}
스코프 끝에서 암묵적으로 변수가 파괴됩니다.
new를 이용해 객체를 생성하고 같은 스코프의 끝에서 파괴하는 코드는 보기 흉하고, 에러를 만들기도 쉽고, 쓸모도 없습니다. 예를 들면:
void fct() // ugly, error-prone, and inefficient
{
X* p = new X;
// use p
delete p;
}
원문
Why isn't the destructor called at the end of scope?
The simple answer is "of course it is!", but have a look at the kind of example that often accompany that question:
void f()
{
X* p = new X;
// use p
}
That is, there was some (mistaken) assumption that the object created by "new" would be destroyed at the end of a function.
Basically, you should only use "new" if you want an object to live beyond the lifetime of the scope you create it in. That done, you need to use "delete" to destroy it. For example:
X* g(int i) { /* ... */ return new X(i); } // the X outlives the call of g()
void h(int i)
{
X* p = g(i);
// ...
delete p;
}
If you want an object to live in a scope only, don't use "new" but simply define a variable:
{
ClassName x;
// use x
}
The variable is implicitly destroyed at the end of the scope.
Code that creates an object using new and then deletes it at the end of the same scope is ugly, error-prone, and inefficient. For example:
void fct() // ugly, error-prone, and inefficient
{
X* p = new X;
// use p
delete p;
}
'번역 > Bjarne Stroustrup's C++ Style and Technique FAQ' 카테고리의 다른 글
Why doesn't my constructor work right? (4) | 2019.01.15 |
---|---|
Does "friend" violate encapsulation? (0) | 2018.12.19 |
How do i define an in class constant? (0) | 2018.08.12 |
Why is the size of an empty class not zero? (0) | 2018.05.10 |
Why is "this" not a reference? (0) | 2018.05.10 |
댓글