2011-04-12 6 views
0

일부 생성자를 사용하여 초기화해야하는 객체의 배열 할당과 관련하여이 문제가 발생했습니다. 내가 무슨 뜻인지 보여 드리죠 :C++ alloc 객체 배열

ofstream* out = new ofstream[10]; 

for(int i = 0; i < 10; i++){ 
    stringstream ss; 
    ss << "file" << i << ".txt"; 
    string str(ss.str()); 
    char *fileName = (char*)str.c_str(); 
    out[i] = ofstream(fileName); //Now, this is wrong 
} 

그리고 나는 wrong 표시된 라인에 약간의 도움이 필요합니다. 해당 배열의 각 구성원을 어떻게 할당합니까? 그리고 여기에 간단한 솔루션에의 delete[] out;

+0

설명 된대로 새로운 배치를 시도, (어쩌면 클래스는 기본 생성자가 없기 때문에)'out'입니다 메모리 누출에 취약하다. out에서'delete []'를 호출하는 것을 잊지 마십시오. –

+0

감사합니다 :) –

답변

5

fileName 변수를 제거하고 out[i].open(str.c_str());를 사용하기 (내가 게시하기 전에 많은 바라 보았다) 너의 문제.

out[i].open(fileName); 
+0

'delete []'도 내 배열의 각 스트림에서'close()'를 호출합니까? –

+1

@iuliux : delete []는 각 스트림의 소멸자가 호출되도록 보장합니다. – Erik

+0

차가움. @Chris Kaminski도 괜찮다고 대답 했음에도 불구하고 대답을 선택하게하십시오. –

5

에 기억 -

그리고 다른 게시물에 저를 가리키는하지 주셔서 감사

2

당신은 strfileName을 제거하여이 문제를 최적화 할 수 : 또한
out[ i ].open(ss.str().c_str());

, 나는 메모리 할당 및 할당 해제에 대해 수행하지 않는 당신에게 요 사용 std::vector을 권 해드립니다. 당신이 정말로 당신이 요소를 삽입 시간을 기준으로 생성자를 호출해야하는 경우
std::vector<std::ofstream>

+0

글쎄, 나는'ss.str(). c_str()'이 작동하지 않는 이유를 일찍 읽었습니다. 사람들은'ss.str'가 임시 객체를 생성한다고 말하고있었습니다. –

+0

어? 그것은 이상합니다. 오케이. 나는 이것에 대해 잘못된 것을 보지 않습니다. 예,'.str()'은 temp 객체를 반환하지만, 무엇을합니까? 파일 (스트림)을 열 때 여전히 "라이브"입니다. –

+0

Visual Studio 2010에서이 도구를 실행했는데 경고가 표시되지 않고 잘 작동합니다. –