2009-07-03 2 views
2

하는 것은 컴파일하고 절대적으로 잘 실행 아웃이 코드를 확인하시기 바랍니다 .. 을 질문입니다 나는 어떠한 유형의 배열을 선언 할 수 있었다 결코 ..C++에서 런타임에 결정되는 가변 길이의 배열을 어떻게 선언 할 수 있습니까?

datatype var[variable_set_at_runtime]; 

++ (터보 C++를) C를 배우기 시작했을 때 그리고 나는이 gcc가 최신 gcc 컴파일러에서 가능하지 않다는 것을 당연한 것으로 생각했지만 ... 놀랍게도 이것은 가능합니다 ...

그럼 내 새로운 질문은 new 연산자의 필요성이 무엇입니까 ?? 나는 새로운 운영자가 등 ... 동적으로 포함하여 해당 자원에 주소를 반환, 힙에서 런타임에 메모리를 할당 많은 일을한다는 것을 알고

..

은 무엇 차이가 나는 느낌이 내 코드가 동적으로 할당한다는 것입니다 스택에 메모리가 새로 추가되는 동안 힙에 ?? 이것이 유일한 차이점은 ...

나는 C++을 배우기 시작했을 때 이것을 할 수 없었기 때문에 정말로 놀랐다. 그리고 ... 나는 그것을 사용자 정의 데이터 유형에 대해서도 할 수있다. .. : -O

#include<iostream> 
using namespace std; 
struct A 
{ 
    int a; 
    int b; 
}; 
int main() 
{ 
    int a; 
    cin>>a; 
    int ch[a]; 
    for(int i=0;i<a;i++) 
     ch[i]=i+1; 
    for(int i=0;i<a;i++) 
     cout<<"\n\nch=="<<ch[i]; 
    A obj[a]; 
    cin>>obj[a-1].a; 
    cin>>obj[a-1].b; 
    cout<<"\n\n obj.a,obj.b=="<<obj[a-1].a<<" , "<<obj[a-1].b; 
} 

되거하시기 바랍니다 ..

감사합니다.

+0

5 분 이내에 7 개의 답변을 볼 수 있습니다. ... - – ashishsony

+0

흥미로운 : MSVC는 여전히 이것을 지원하지 않습니다. 그래서 코드가 MS 세계로 컴파일되지 않을 것입니다 :-) – mmmmmmmm

답변

11

그리고 난이 최신 GCC 컴파일러에서 할 수 질수 부여 ...하지만 놀랍게도이 가능 입니다 그것을했다가 ...

그것은 C C에서 법적 있지만 ++ . 컴파일러 플래그에 따라 GCC가 허용 될 수도 있지만 코드를 엄격한 C++로 컴파일하면 동적 길이 배열이 허용되지 않으므로 new을 사용해야합니다. 이 범위를 벗어나면 스택에

  • 데이터를 자동으로 정리됩니다 :이 그렇다

    (나는 아직 아무도이 작은 세부 사항을 언급하지 않았다 놀랐어요), 두 개의 다른 큰 차이는 있습니다

  • 일반적으로 1MB와 같은 것이 스택에 할당됩니다. 대용량 데이터 구조는 대신 힙에 있어야합니다.

그러나 실제로 가장 중요한 단일 요점은 첫 번째 것입니다. 이는 유효한 C++가 아닙니다. (그리고 Neil이 지적했듯이, C++ 0x에서는이 값을 추가 할 계획이 없습니다.)

+2

그리고 누군가 묻기 전에 C++ 0x 역시 유효하지 않은 것처럼 보입니다. –

+2

또한 C99에서만 유효합니다. –

+0

btw C++ 0x 발음은 어떻게 되나요 ?? – ashishsony

0

스택은 매우 적은 양의 메모리입니다. 작고 임시적인 것만을 스택에 할당해야합니다. 크거나 비 임시 객체는 힙에 할당하기에 좋을 것입니다.

예, 메모리를 세 심하게 관리해야합니다.

0

할당이 범위를 벗어나면 "자동으로"할당 된 항목이 사라집니다. new으로 "힙에"할당 된 것은 그렇지 않습니다.

0

지정한대로 선언 된 모든 변수가 스택에 저장됩니다. 범위를 벗어나면 더 이상 유효하지 않습니다. 그러나 new를 사용하여 배열을 선언하면 힙에 할당되고 delete를 호출 할 때까지 유효합니다.

datatype *var=new [variable_set_at_runtime]; 

을 다음이 그것으로 끝나면 삭제 :

1

당신은 새로운 사용하십시오

delete[] var; 
0

당신은 여전히 ​​힙에 일을 할당 할 new 연산자를 필요로하고이 당신이 그들이 생성 된 함수의 범위를 벗어나서 생존하기를 원한다면 필요합니다.

스택은 종종 크기면에서 힙보다 훨씬 제한적입니다. O 아니, new 길게하면서 조금씩 주위 있다고 생각

:-) 가변 길이 배열 선언 방법을 이용하여 생성 된 객체의 연결리스트 (또는 임의 비 배열 회수)를 참조.

2

당신은 새로운 사용하여 힙에 할당 할 수 있습니다

int* ch = new int[ a ]; 

을하지만, 사용 후 할당을 해제하는 것을 잊지 마세요 :

delete [] ch; 

더 좋은 방법은 사용하는 것 정확히 원하는 것을 수행하는 std::vector.

+0

저는 C++을 처음 접했으므로, 여러분의 제안을 시도해 보았습니다. 난 그냥 내 코드가 옳은지 아닌지 알고 싶다. 나는이'delete [] ch;'를'main()'함수의 하단에 넣었습니까? 내 말은, 전체 코드의 끝에서.난 그냥 초보자로서 배우고 싶습니다, 앞으로'std :: vector'를 사용할 것입니다.) –

0

그게 정확히 차이 "내가 어떤 느낌의 차이는 ... 새가 ?? 힙을 수행하면서 내 코드가 동적으로 유일한 차이는 스택에 메모리를 할당하는 것입니다." 기억해라. 스택에는 제한된 공간이 있지만 힙에는 제한이 없습니다 (분명히 몇 가지 제한이 있습니다 ... 하나에 4 기가 할당을 시도하십시오)). 일반적으로 이드에서는 스택 할당이 상대적으로 작다는 것을 알고 있다면 메서드를 사용하고 그렇지 않으면 힙에 스택을 생성합니다.

1

이제 두 가지 접근법이 있습니다. 제안했지만, 예를 들어 메모리를 누설하지 않도록해야한다는 등의 문제가 있습니다.

나는 이런 종류의 물건을 처리하기 위해 STL을 사용하는 것이 좋습니다. 예를 들어 목록입니다.

그런 식으로 메모리 관리를 직접 처리 할 필요가 없으며 코드가 더 멋지게 보입니다.

몇 가지 가이드 여기를 찾습니다 http://www.sgi.com/tech/stl/

+1

+1 : STL은 C++에서 동적 배열을 구현하는 데 가장 적합한 솔루션입니다. std :: vector <>와 같은 것은 배열을 대체하는 좋은 방법입니다. –

+0

@ D.Shawley 당신은 apvector와 vector 사이에서 어떤 종류의 함수 (C++의 동적 배열을 구현)에 더 좋다고 생각합니까? 나는 우연히 apvector를 발견하고, 그것은 매우 쉽고 편리하다는 것을 안다. –

0

사용 _alloca를. 내 대답은 여기 Variable Sized Arrays in C

+0

'new' /'delete'와 같은 방법으로 생성자와 소멸자를 호출하지 않기 때문에 C 라이브러리에서'malloc' /'free' 계열 할당을 사용하지 마십시오. – dmckee

+0

OP에는 생성자가없는'int' 배열과 POD 구조체 배열이 있습니다. 그가 대신 클래스 1 클래스를 사용하지만 스택 할당 (예를 들어 코드가 성능에 민감한 경우)을 원한다면 그는 in-place 'new'를 호출하고 수동으로 소멸자를 호출 할 수 있습니다. –

관련 문제