IT박스

객체 생성 :`new`의 유무에 관계없이

itboxs 2020. 7. 17. 21:12
반응형

객체 생성 :`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

반응형