2009-05-07 1 views
1

지금 당장 XML 파일 구문 분석을 처리하는 간단한 클래스가 유용합니다. 이 같은 보이는 : 프로그램의 주요 부분에C++에서 클래스간에 런타임 크기의 배열 전달을 처리하는 방법

int* DataParser::getInts(){ 
    *objectNumbers = new int[getSize()]; 
    for (int i=0;i<getSize();i++){ 
      objectNumbers[i]=activeNode->GetNextChild()->GetContent(); 
    } 
    return objectNumbers; 
} 

을, 나는 수행하여이 나타납니다

int* numbers= data->getInts(); 
///Do things to numbers[] 
delete numbers; 

모든 모든 충돌 삭제 명령까지 잘 작동합니다. 이 일을하는 올바른 방법은 무엇입니까?

답변

9

문제의 일부는 새로운 []과 (과) delete []을 (를) 페어링하지 않는 것입니다. 이것은 아마 당신의 버그의 근원이 아니지만 이것을하기위한 습관에 빠져 있어야합니다.

버그는 당신이 주석으로 남긴 코드와 거의 관련이 있습니다. 우리가 숫자 값으로 무엇을하는지 볼 수 있도록 거기에 더 많은 컨텍스트를 추가 할 수 있습니까?

일반적으로 나는 을 많이 발견합니다.이 유형의 문제에 대한 벡터를 사용하기가 더 쉽습니다. 방정식에서 메모리 관리를 제거하고 동적 메모리로 크기를 저장하는 추가 이점이 있습니다.

void DataParser::getInts(std::vector<int>& objectNumbers){ 
    for (int i=0;i<getSize();i++){ 
     objectNumbers.push_back(activeNode->GetNextChild()->GetContent()); 
    } 
} 

... 
std::vector<int> numbers; 
data.getInts(numbers); 
+0

고맙습니다. 벡터가 분명히 올바른 해결책이었습니다. – mjames

2

다음 줄 :

*objectNumbers = new int[getSize()]; 

는 무엇입니까? 당신이 objectNumbers을 반환하는 경우,이 int에 대한 포인터이며, 당신이 정말로 일을해야한다 :

objectNumbers = new int[getSize()]; 

을 어쨌든, C++는 당신에게 컬렉션 (vector, list 등) 제공 - 내가 대신 그 중 하나 사용한 것 일반 배열의. 다른 곳에서 언급했듯이 newdeletenew []delete []으로 일치시키는 것이 중요합니다.

배열을 전달하는 것은 좋은 디자인이 아닙니다. 구현을 공개로하고 있습니다. 반복자를 STL 디자인을 따르는 배열/컬렉션/시퀀스 int의 시작과 끝 부분에 전달합니다.

+0

좋은 캐치. 그가 int * objectNumbers =를 의미하는지 궁금합니다 ... –

+0

이 코드가 어떻게 컴파일되는지 궁금합니다. – dirkgently

3

당신은 때마다

ptr = new Type[...]; 

당신이

delete [] ptr; 

대신 일반

delete ptr; 
의 확인

delete [] numbers; 

에 규칙입니다 필요

이것은 정의되지 않은 동작을 일으킬 것이며 (Neil Butterworth에게 감사) 배열이 아닌 ptr을 가리키는 단일 인스턴스를 삭제하기위한 것입니다.

+0

사실 C++ 표준에서 "정의되지 않은 동작"이라고 부르는 것을 제공합니다. –

+0

그래, 나는 삭제 ptr의 의미를 전달하려고 노력했다. 하지만 정의되지 않은 행동을 포함시키는 것이 좋습니다. 감사. –

1

신속하게 문제와 유지 관리 문제가 발생합니다. 표준을 사용하여 고려하십시오 : : 벡터, 이것이 그것을 할 수있는 적절한 방법입니다.

2

대신 단순히 std :: vector를 사용하십시오.

std::vector<int> DataParser::getInts(){ 
    std::vector<int> objectNumbers(getSize()); 
    for (int i=0;i<getSize();i++){ 
      objectNumbers[i]=activeNode->GetNextChild()->GetContent(); 
    } 
    return objectNumbers; 
} 
+0

이 코드는 결과적으로 벡터 내용의 복사본을 생성합니다. 아마 두 번 이상. JaredPar의 예가 올바른 방법입니다. 벡터를 참조로 전달하고 getInts로 채 웁니다. – chmike

+1

반드시 필요한 것은 아니지만이 코드는 일반적으로 반환 값 최적화의 이점을 누릴 수 있습니다. – Jem