IT박스

new와 without를 사용하여 객체를 인스턴스화하는 것의 차이점은 무엇입니까?

itboxs 2020. 8. 22. 08:25
반응형

new와 without를 사용하여 객체를 인스턴스화하는 것의 차이점은 무엇입니까?


C ++에서

동적 메모리 할당을 제외하고 다음 두 줄의 코드간에 기능적 차이가 있습니다.

Time t (12, 0, 0); //t is a Time object

Time* t = new Time(12, 0, 0);//t is a pointer to a dynamically allocated Time object

물론 Time (int, int, int) ctor가 정의되었다고 가정합니다. 또한 두 번째 경우 t는 힙에 할당되었으므로 삭제해야한다는 것을 알고 있습니다. 다른 차이점이 있습니까?


라인 :

Time t (12, 0, 0);

... 일반적으로 스택에있는 Time로컬 범위 에 유형의 변수를 할당하며 범위가 끝나면 소멸됩니다.

대조적으로 :

Time* t = new Time(12, 0, 0);

... ::operator new()또는 을 호출하여 메모리 블록을 할당 한 Time::operator new()다음 해당 메모리 블록 내의 주소 Time::Time()thisset을 호출 하고 (의 결과로도 반환 됨 new)에 저장됩니다 t. 아시 다시피이 작업 일반적으로 힙 (기본)에서 수행되며 delete나중에 프로그램에서 수행 해야하는 반면 포인터 t일반적으로 스택에 저장됩니다.


한 가지 더 분명한 차이점은 t의 변수와 메서드에 액세스 할 때입니다.

Time t (12, 0, 0);
t.GetTime();

Time* t = new Time(12, 0, 0);
t->GetTime();

생성자에 관한 한 두 형식은 기능적으로 동일합니다. 새로 할당 된 개체 인스턴스에서 생성자가 호출되도록합니다. 할당 모드와 개체 수명의 차이를 이미 잘 알고있는 것 같습니다.


나는 당신이 이미 모든 차이점을 이해했다고 생각합니다. 포인터와 변수를 통해 t의 멤버에 액세스하는 구문 차이에 대해 잘 알고 있다고 가정합니다 (포인터도 변수이지만 내가 의미하는 바를 이해하는 것 같습니다). 또한 t를 함수에 전달할 때 값에 의한 호출과 참조에 의한 호출의 차이를 알고 있다고 가정합니다. 또한 t를 다른 변수에 할당하고 다른 변수를 통해 변경하면 어떤 일이 발생할지 이해한다고 생각합니다. t가 포인터인지 아닌지에 따라 결과가 달라집니다.


스택에 할당하는 것과 힙에 할당하는 것 사이에는 객체의 기능적 차이가 없습니다. 둘 다 객체의 생성자를 호출합니다.

부수적으로 나는 힙에 할당 할 때 기능적으로 동일한 boost의 shared_ptr 또는 scoped_ptr을 사용하는 것이 좋습니다 (복사 불가능한 포인터 복사를 제한하는 scoped_ptr의 추가적인 유용성과 함께).

scoped_ptr<Time> t(new Time(12, 0, 0));

아니 .. 다른 차이는 없어 ..


이미 알고있는 것과 다른 차이는 없습니다.

코드가 기본 연산자 new의 서비스를 사용한다고 가정합니다.


  • new 사용 : 연산자 new 함수를 호출하여 동적 메모리를 얻은 다음 constuctor 함수를 호출합니다.
  • new를 사용하지 않음 : operator new 함수를 호출하지 않고 직접 constuctor 함수를 호출합니다. 스택은 malloc에 ​​사용되지 않고 직접 사용됩니다.

void foo (Time t)
{
  t = Time(12, 0, 0);
}

void bar (Time* t)
{
  t = new Time(12, 0, 0);
}


int main(int argc, char *argv[])
{
  Time t;
  foo(t);//t is not (12,0,0),its value depends on your defined type Time's default constructor. 

  bar(&t);//t is (12,0,0)
  return 0;
}

참고URL : https://stackoverflow.com/questions/3673998/what-is-difference-between-instantiating-an-object-using-new-vs-without

반응형