2013-02-21 2 views
1

메모리 할당 오류를 알아내는 데 도움이 필요합니다. fList 다음 코드에서 큰 경우 ...문자열을 char로 변환하는 중 메모리 할당 오류 *

Error: Memory could not be allocated.

: :이 오류가 계속

for (unsigned int ii=0; ii<fList.size(); ii++) { 

    char *fName = new char[fList[ii].length() + 1]; 
    strcpy(fName, fList[ii].c_str()); 
    err = xInitFile(fName, ii+1); 
    if(err != 0) { 
     cout << "FOOBAR" << endl; 
    }    
    delete[] fName; 
} 

fListstd::vector<std::string>이다. 작은

int xInitFile(char *fName, int fHandle) 

fList 경우, 모든 것이 잘 실행 :

기능 xInitFile는 다음과 같은 프로토 타입과 C 공유 라이브러리 기능입니다. 나는이 문제가 문자열을 char *으로 변환하는 방법에 문제가 있음을 확신하지만, 문제를 해결하는 방법을 알 수 없다. 내가 알 수있는 한 fName은 항상 삭제되므로 메모리 누수가되지 않습니다. 코드를 실행하는 동안 내 메모리 사용량이 급증하지 않습니다.

편집 :

err = xInitFile(fName, ii+1);을 주석 오류를 제거합니다. 즉, 할당 오류는 xInitFile에서 발생하고 있습니다. 문제가 내 코드에 있다고 생각했기 때문에 이전에이 코드를 시도하지 않았다 (b/c 나는 C++을 처음 사용함).

+1

와 짝 '오류 :. 메모리 할당 할 수 없습니다'? 심지어 당신의 메모리 할당과 관련이 있습니까? 관련없는 코드 조각을 여기에 보여주고있는 것처럼 보입니다 ... –

+0

for 루프 내부에서 fName을 삭제하면 더 좋지 않습니까? 그런 식으로 사용하고 즉시 삭제합니다. 당신이 삭제하지 않을 때부터 매 반복마다 fName에 대한 새로운 위치가 memorycongestion으로 이어진다. –

+0

try/catch를 사용하여'new'로 줄을 감싸고 잡을만한 것으로 인쇄하십시오. 메시지를 보게되면이 오류는'new'에 의해 생성되고, 다른 경우에는'xInitFile'에 의해 생성됩니다. – borisbn

답변

1

한 가지 이유 때문에 눈살을 찌푸 리겠지만, 대신 strdup을 시도해 볼 수 있습니다.

char *fName = strdup(fList[ii].c_str()); 

지문 그래서

free(fName); 
+2

'strdup'의 유일한 단점은 (C 또는 C++) 표준이 아니라는 것입니다. 그것은 Posix이고 VC++ (대신에'_strdup'를 사용할 수있는 곳)에 대한 경고를받을 것입니다. 그것은 당신 자신의 것을 작성하는 것은 매우 간단 합니다만, 사실 저는 C++ 문자열을'std :: vector '에 추출한 것을 사용합니다. 아니면 단지 몇 줄의 코드 일 뿐이며,'char * '에 자주 출력되는 레거시 C에 자주 접속한다면, 그만한 가치가 있습니다. (레거시 C가 출력되지 않으면'std :: string :: c_str()'만 사용하면 충분합니다.) –