Programing

C ++에서 "new"를 사용하는 경우와 사용하지 않는 경우

crosscheck 2020. 8. 24. 07:35
반응형

C ++에서 "new"를 사용하는 경우와 사용하지 않는 경우 [복제]


중복 가능성 :
C ++에서 새 키워드는 언제 사용해야합니까?

C ++에서 "new"연산자는 언제 사용해야합니까? 저는 C # / Java 배경에서 왔으며 개체를 인스턴스화하는 것이 혼란 스럽습니다.

"Point"라는 간단한 클래스를 만든 경우 점을 만들 때 다음을 수행해야합니다.

Point p1 = Point(0,0);

또는

Point* p1 = new Point(0, 0);

누군가 새 연산자를 사용해야 할 때와 사용하지 않을 때를 설명해 줄 수 있습니까?

중복 :

C ++에서 new 키워드는 언제 사용해야합니까?

관련 :

사용자 지정 개체에 대한 C ++의 생성자 / 소멸자 및 새 / 삭제 연산자 정보

C ++에서 적절한 스택 및 힙 사용?


당신은 사용해야 new당신이 때까지 존재에 남아 객체를하고자 할 때 delete그것. 사용하지 않으면 new범위를 벗어날 때 개체가 파괴됩니다. 이에 대한 몇 가지 예는 다음과 같습니다.

void foo()
{
  Point p = Point(0,0);
} // p is now destroyed.

for (...)
{
  Point p = Point(0,0);
} // p is destroyed after each loop

어떤 사람들은의 사용이 new객체가 힙에 있는지 스택에 있는지 결정 한다고 말할 것입니다. 그러나 이는 함수 내에서 선언 된 변수에만 해당됩니다.

아래 예에서 'p'의 위치는 포함 개체 인 Foo가 할당되는 위치입니다. 나는 이것을 'in-place'할당이라고 부르는 것을 선호합니다.

class Foo
{

  Point p;
}; // p will be automatically destroyed when foo is.

를 사용하여 객체를 할당 (및 해제)하는 new것은 제자리에 할당되는 것보다 훨씬 비싸므로 사용을 필요한 경우에만 제한해야합니다.

via 할당시기의 두 번째 예는 new어레이를위한 것입니다. 런타임에 인플레 이스 또는 스택 어레이의 크기를 변경할 수 없으므로 크기가 결정되지 않은 어레이가 필요한 경우 new를 통해 할당해야합니다.

void foo(int size)
{
   Point* pointArray = new Point[size];
   ...
   delete [] pointArray;
}

(* 선점 형 nitpicking-예, 가변 크기 스택 할당을 허용하는 확장이 있습니다).


한 번 봐 가지고 이 질문이 질문에 C ++ 객체 인스턴스화에 좋은 답을합니다.

이 기본 아이디어는 힙에서 인스턴스화 된 객체 (new 사용)는 수동으로 정리해야하며 스택에서 인스턴스화 된 객체 (new없이)는 범위를 벗어나면 자동으로 정리된다는 것입니다.

void SomeFunc()
{
    Point p1 = Point(0,0);
} // p1 is automatically freed

void SomeFunc2()
{
    Point *p1 = new Point(0,0);
    delete p1; // p1 is leaked unless it gets deleted
}

스택 대신 힙에 개체를 만들려면 new를 사용해야합니다. 이렇게하면 포인터를 사용하여 현재 함수 또는 프로 시저 외부에서 개체에 액세스 할 수 있습니다.

C ++에서 포인터와 메모리 관리를 찾는 데 유용 할 수 있습니다. 이는 다른 언어에서는 볼 수 없을 것입니다.


New는 항상 동적 메모리를 할당하는 데 사용되며, 그런 다음 해제해야합니다.

By doing the first option, that memory will be automagically freed when scope is lost.

Point p1 = Point(0,0); //This is if you want to be safe and don't want to keep the memory outside this function.

Point* p2 = new Point(0, 0); //This must be freed manually. with...
delete p2;

참고URL : https://stackoverflow.com/questions/679571/when-to-use-new-and-when-not-to-in-c

반응형