2016-08-15 2 views
2

동적 메모리 할당과 관련하여 질문이 있습니다.프로그래밍 언어를 통한 동적 메모리 할당

C 오면, 메모리 기능을 의 malloc을 이용하여 분배(), 은 calloc()realloc을()무료()를 이용하여 할당이 끊긴 부하. C++ 같은 반대 지향 언어에서 그러나

, C#자바는, 메모리는 동적으로 새로운를 사용하여 할당되고 C++의 경우 키워드 (사업자)을 삭제하여 할당 해제.

내 질문은 왜 동적 메모리 할당을 위해 이러한 객관적인 지향 언어에 대한 함수 대신 연산자가 있습니까? new를 사용할 때조차도 함수처럼 할당 도중 클래스 객체 참조에 포인터가 반환됩니다.

구문을 단순화하기 위해서입니까? 아니면 더 깊은 이유가 있습니까?

+0

다른 언어, 다른 사업자, 다른 의미 (여기서 중요한 것은, '그 언어 new'가하는 단지 할당보다 더 많은 메모리를)하게된다. –

+1

[Java가 왜 '새로운'을 필요로하는 것일까?] (http://stackoverflow.com/questions/6340535/is-the-new-keyword-in-java-redundant). 일반적인 non-authorative 대답은 "because C++"입니다 (C++의'new'는 꽤 자주 코드 냄새가 나기 때문에 재미 있습니다.). 어떤 시점에서 Java 디자이너는 좋은 생각이라고 생각했습니다. 아직 확신 할 수 없습니다. C#의 디자이너는 아마도 "Java"를 사용했을 것입니다. – juanchopanza

+1

나는 이론적 근거가 있다고 생각하지 않는다. Stroupstrup은 그것이 C에서 어떻게 이루어 졌는지를 보았고 "이봐, 이거 꽤 어리 석다"고 생각했다. 그리고 나서 그는 다음과 같이 생각했습니다. "나는 멍청한 것을 생각해 낼 수 있다고 확신합니다!". 그리고 거기에 최대 버그 잠재력을위한 프로그래밍 언어 디자인이 있습니다. 실제로 new, new, delete 및 delete와 같은 4 개의 연산자가 있습니다. 너와 같이 섞어 라. 또한 애플리케이션 프로그래머가 과부하가 걸릴 수 있습니다. Java 및 C#의 경우 단순히 C++에서 연산자 이름을 복사/붙여 넣기합니다.그리고 그들은 가비지 컬렉션을 가지고 있기 때문에 삭제에 신경 쓰지 않습니다. – Lundin

답변

4

C에서 메모리 할당 함수는 바로 그 것입니다. 그들은 메모리를 할당합니다. 다른 건 없어. 완료되면 메모리를 해제해야한다는 것을 기억해야합니다. 객체 지향 언어에서

(C++, C#을, 자바, ...)을하는 new 연산자는 메모리를 할당하지만 것입니다 그것을 것 또한 호출 객체를 초기화하기위한 특별한 방법 객체 생성자.

여러분도 알다시피, 그것은 의미 론적으로 완전히 다른 것입니다. new 연산자는 단순한 구문이 아니라 일반 메모리 할당과 실제로 다릅니다.

C++에서 작업을 마친 후에도 메모리를 해제해야합니다.

C# 및 Java에서는 가비지 수집기에서 처리합니다.

0

객체 지향 디자인/프로그래밍의 요점은 의미있는 추상화를 제공하는 것입니다.

좋은 OO 디자인을하고있을 때; 당신은 (즉시) 기억에있는 영역에서 생각하지 않습니다. 사람은 대상에 대해 생각합니다. 상태를 전달하고 행동을 제공합니다.

C++로 코드를 작성할 때도 대부분의 경우 "내 비트가 정렬되는 이유", "런타임시 필요한 객체 중 하나가 얼마나 많은 메모리가되는지"등과 같은 미묘함에 대해 걱정할 필요가 없습니다. . 물론 이러한 질문은 특정 상황과 관련이 있습니다. 그러나 객체 지향 설계 내에서; 진정한 가치는 가능한 한 정확하고 쉽고 유지할 수있는 "모든 도메인"문제를 해결하는 데 도움이되는 유용한 추상화를 만드는 데 있습니다.

"키워드"대 "기능"의 경우 : Java 만 살펴보십시오. 언어의 아버지는 단순히 자바 프로그래머가 "메모리 포인터"에 대해 생각하기를 원하지 않았습니다. 당신은 사물을 다루어야합니다. 및 객체에 대한 참조. 따라서, 메모리를 "할당"하고 "포인터"를 되 찾는 개념은 여기에 전혀 존재하지 않습니다. 그렇다면이 기능을 라이브러리 메소드로 어떻게 제공할까요? 글쎄, 당신이 원한다면 : 당신은 할 수 없다.

마지막으로 어느 정도는 언어를 디자인하는 사람들이 "취향/스타일"의 문제입니다. 때때로 사람들은 작은 언어 코어를 선호합니다. 도서관에서 모든 일을하십시오. 다른 사람들은 "더 많은"물건을 내장하는 것을 선호합니다.

+0

예. 하지만 왜 함수 대신 연산자가 필요합니까? – juanchopanza

+0

"메모리 포인터"는 연산자 대 함수와 아무 관련이 없습니다. C++에서'new' 표현식은 어쨌든 포인터를 반환합니다. – juanchopanza

+0

questioner 님이 ** memory allocation **에 관해 질문했습니다. 그는 4 번 같은 용어를 사용했습니다. 그래서 나는 생각한다 : 그것은 그에게 중요하다. – GhostCat

0

나는 당신이 말한 것처럼 구문을 단순화하기 위해서만 이루어 졌다고 믿습니다. 연산자는 단순히 메서드 (또는 함수)를 호출하는 또 다른 방법 일뿐입니다. "12 + 13"을 사용하는 것은 Add (12, 13)를 사용하는 것과 다르지 않습니다. 이를 볼 수 방법이 예를 들어 C#의 연산자 우선 경유 :

// Sample from - https://msdn.microsoft.com/en-us/library/8edha89s.aspx 
public static Complex operator +(Complex c1, Complex c2) 
{ 
    Return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary); 
} 

그것은 일반적인 방법입니다하지만 복잡한 클래스를 통해 사업자의 사용을 할 수 있습니다. "new"와 같은 메모리 할당 연산자와 다르지 않으므로 Add 연산자를 예제로 사용하고 있습니다.

+0

Java에서'T t = new T();는'T t();보다 간단한 구문입니다. – juanchopanza

+1

나는 동의한다. 그러나 당신은'T t();'문법이'T t = new T();'보다 명확하지 않다고 주장 할 수있다. 이것은 첫 번째 구문에서 t에 값을 시각적으로 할당하지 않는다는 사실 때문입니다. 두 번째 단계에서는 t가 특정 값과 동일하다는 것을 분명하게 나타냅니다. – MichaelThePotato

+0

좋은 지적. 그래서,'Tt = T();'입니다. – juanchopanza

0

새로운 키워드는 구문을 단순화하는 데 이상적이며, 이는 암시 적이며 메모리 할당 이외에도 생성자를 호출합니다.

한 가지 당신은 말했다 :

메모리가 동적으로 할당 및 할당 해제 새로운를 사용하여 삭제 키워드 (사업자) 자바와 C#에 대한

되는 C++, C# 및 자바,

그 새 키워드 일 뿐이므로 삭제가 없습니다. C#에서는 객체가 더 이상 사용되지 않을 때 리소스가 해제되도록 using 블록을 사용할 수 있지만 Dispose 메서드를 호출 할 때와 같은 모든 경우에 메모리 해제가 필요하지는 않습니다.

GhostCat이 말했듯이 객체 지향 프로그래밍 언어의 목표는 프로그래머가 메모리가 대부분의 경우에 할당되는 방식을 생각하게하고 더 중요한 것은, 객체가 어떻게 공개 되었는가, 이것이 가비지 컬렉터가 도입 된 이유입니다.

주요 원칙은 프로그래밍 언어가 높을수록 메모리 관리와 같은 작업을 추상화하고 실제 비즈니스 문제를 해결할 수있는 쉬운 방법을 제공해야한다는 것입니다. 물론 이것은 프로그래밍 언어가 특정 작업을 위해 선택 될 때 고려되었을 수 있습니다.

+0

Duly는 수정을 언급했다. :) – SoulRayder

+0

@SoulRayder 실례합니다, 어떤 교정? – meJustAndrew

+0

C# 및 Java의 delete 키워드가 없습니다 – SoulRayder

0

C : malloccalloc은 기본적으로 메모리를 할당하는 유일한 방법은 C입니다.

  • 의 malloc : 그것은 임의의 값으로 초기화하지 않고 요청 된 크기에 따라 초기화되지 않은 메모리를 할당
  • 은 calloc : malloc 거의 동일한 플러스 또한 0으로 초기화 (0). 두 경우 모두

, 당신은 뭔가 필요 :

  • 할당 요청 된 메모리 크기는 초기화시에 부여해야하고 그것은 realloc 증가 할 수 있습니다.
  • 할당 된 메모리를 free으로 삭제해야합니다. free은 많은 메모리를 사용하고있을 때 누군가가 할당 된 메모리를 해제 할 수있는 좋은 메모리가없는 경우 가끔 OOM 오류가 발생할 수 있습니다. .

NOTE : Castingsize은 (메모리를 할당하기 위해) ++ malloccalloc

C로 필요합니다 newdelete, newdelete 따라도 (도 무료로 재 할당) malloccalloc 가지고 ++ C가 생각할 수있는 메모리를 할당하고 해제하는 현대적인 방법이지만 OOP's 기반 언어의 not all 모두가 있습니다. 예 : java에는 delete이 없습니다.

  • newparameterize, default 또는 복사 생성자를 사용하여 초기 값을 설정하는 다양한 시나리오가있을 때 objects와 함께 작업하는 동안 꽤 유용 그래서 기본 값을 초기화하는 생성자를 사용합니다.

NOTE : new하면 malloccalloc 및 할당 메모리의 크기를 줄 필요가 없습니다와는 달리 적절한 케이스를 할 필요가 없습니다. 하나 더 적은 것, 맞아.

  • delete

    가 메모리를 해제하는 데 사용됩니다, 일부 개체에 delete 호출은 또한 다음 현재 상태 등을 저장하고 같은 일부 작별 작업을 수행 할 수있는 객체의 생명주기의 마지막 장소입니다 destructor를 호출 메모리가 해제됩니다.

Note : C#java에서 메모리의 deallocationrelease에 메모리 관리가 memory.It가 메모리에 대한 참조 변수를 가리키는이없는 경우 메모리를 해제하는 mark-sweep 같은 various algos를 사용하거나하지 Garbage-Collector에 의해 처리됩니다 참조 변수 값은 null로 설정됩니다.

더 이상 필요하지 않은 메모리에서 해당 개체를 가리키는 참조 변수가있는 경우이 또한 memory leak이 될 수 있습니다.

GC의 단점은,이 느린 것을