C ++에서 "new"를 사용하는 경우와 사용하지 않는 경우 [복제]
중복 가능성 :
C ++에서 새 키워드는 언제 사용해야합니까?
C ++에서 "new"연산자는 언제 사용해야합니까? 저는 C # / Java 배경에서 왔으며 개체를 인스턴스화하는 것이 혼란 스럽습니다.
"Point"라는 간단한 클래스를 만든 경우 점을 만들 때 다음을 수행해야합니다.
Point p1 = Point(0,0);
또는
Point* p1 = new Point(0, 0);
누군가 새 연산자를 사용해야 할 때와 사용하지 않을 때를 설명해 줄 수 있습니까?
중복 :
관련 :
사용자 지정 개체에 대한 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
'Programing' 카테고리의 다른 글
기본 생성자는 더 이상 VS2015에서 컴파일되지 않습니다. (0) | 2020.08.24 |
---|---|
기본 생성자는 더 이상 VS2015에서 컴파일되지 않습니다. (0) | 2020.08.24 |
자원의 이름을 지정하는 방법에 대한 규칙이 있습니까? (0) | 2020.08.24 |
더 효율적인 방법 : 여러 MySQL 테이블 또는 하나의 큰 테이블? (0) | 2020.08.24 |
균등 분포를 정규 분포로 변환 (0) | 2020.08.24 |