2011-04-12 61 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标记线一些帮助。我该如何分配数组的每个成员?

谢谢你不指着我的其他职位(我看到了很多发布前)

+0

放置新的'out'是容易发生内存泄漏。记得调用'delete []'打开。 – 2011-04-12 20:05:41

+0

做到了,谢谢:) – 2011-04-12 20:50:59

回答

5

摆脱fileName变量和使用out[i].open(str.c_str()); - 并记住delete[] out;

+0

'delete []'还会在我的数组中的每个流上调用'close()'? – 2011-04-12 20:07:44

+1

@iuliux:delete []将确保每个流的析构函数被调用 - 关闭它。 – Erik 2011-04-12 20:10:04

+0

很酷。然后让你的答案成为你选择的答案,尽管@Chris Kaminski也回答了很好 – 2011-04-12 20:17:14

5

这是最简单的解决方案你的问题。

out[i].open(fileName); 
2

您可以优化此,有消除strfileName
out[ i ].open(ss.str().c_str());

另外,我建议你哟使用std::vector不要携带内存分配和释放。
std::vector<std::ofstream>

+0

嗯,我早些读过为什么'ss.str()。c_str()'不起作用。这些人说,'ss.str'生成一个临时对象。 – 2011-04-12 20:15:48

+0

咦?这很奇怪O.o我没有看到任何错误 - 是的,'.str()'返回临时对象,但是什么?打开文件(流)时仍然是“活的”。 – 2011-04-12 20:23:17

+0

我刚刚在Visual Studio 2010上运行了这个版本,但没有警告,它工作得很好:? – 2011-04-12 20:24:50