2013-02-21 56 views
1

我需要一些帮助来计算内存分配错误。我不断收到此错误:将字符串转换为char时的内存分配错误*

Error: Memory could not be allocated.

...当fList是在下面的代码大:

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>

功能xInitFile是C共享库函数具有下列原型:

int xInitFile(char *fName, int fHandle) 

如果fList较小,则一切都正常运行。我很确定问题在于我如何将字符串转换为char *,但我无法弄清楚如何解决它。据我所知,fName总是被删除,所以它似乎不是内存泄漏。我的内存使用量在运行代码时也不会激增。

编辑:

注释掉err = xInitFile(fName, ii+1);消除错误。这意味着分配错误发生在xInitFile,对吧?我之前并没有想过这样做,因为我认为问题出现在我的代码中(我是新来的C++)。

+1

那么,谁打印服务 '错误:内存不能分配'?它甚至与你的内存分配有关吗?好像你在这里展示不相关的代码片段...... – 2013-02-21 16:04:25

+0

如果你在for循环中删除了fName,那么你使用它并立即丢弃它是不是更好?可能是因为你没有删除,并且在每次迭代中你都会得到一个fName的新位置,导致内存占用 – 2013-02-21 16:04:33

+0

用try/catch包装'new'并打印一些东西。如果你看到你的消息,那么这个错误是由'new'产生的,在另一种情况下是'xInitFile'产生的。 – borisbn 2013-02-21 16:04:50

回答

1

这可能是因为某种原因而皱起眉头,但我倾向于尝试strdup

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

搭配

free(fName); 
+2

'strdup'唯一的缺点是它不是(C或C++)标准。这是Posix,你会用VC++得到一个警告(你可以使用'_strdup'代替它)。编写自己的代码非常简单,但事实上,我会使用将C++字符串提取到'std :: vector '中的东西,并使用它。或者创建一个类来做到这一点:它只是几行代码,并且如果你频繁地连接到遗留的C,它将'输出到'char *',这是值得的。 (如果遗留的C没有输出,只需使用'std :: string :: c_str()'就足够了。) – 2013-02-21 16:41:29

相关问题