内存分配中的C ++错误

时间:2014-07-06 10:03:37

标签: c

下面的代码以错误结束,编译器指向fprintf(f,szBuffer)。猜猜这是由于内存分配造成的。它有什么问题?

int maxl = 1000000;
szBuffer = (char*)malloc(maxl);
if (sock.GetMail(szBuffer, maxl)) 

    {
       FILE* f = fopen("testfile.txt", "wt");
       if (f)
            {
                fprintf(f, szBuffer);
                fclose(f);
                sock.DeleteMail();
            }
        else
            {
                LogEvent("[%s] [ERROR] Cannot create file %s", m_szInstanceName, szFileName);
            }
    }

free(szBuffer);

2 个答案:

答案 0 :(得分:0)

永远不要让格式字符串动态/可访问/可更改,即使它很简单。

如果(在这种情况下)您的文字包含潜在的格式标记(如%s),则会导致错误。还要确保字符串空值正确终止。

而是使用其他替代方法或添加虚拟格式字符串:

fprintf(f, "%s", szBuffer);

这实际上可能是崩溃的原因,但如果不知道邮件的内容,我们就不能肯定地说。

另外 - 正如Ed在评论中所提到的 - 你不应该在C ++程序中使用malloc()free()。请改用newdelete,因为这些将在必要时正确调用构造函数/析构函数(对于char数组并不重要,但它仍然不是很整洁。)

答案 1 :(得分:0)

你需要检查malloc的返回值,它可以是NULL。

你也应该使用下面的fprintf

fprintf(f,"%s",szBuffer);

这是因为szBuffer可能有任何格式字符串(如%d,%s等),在这里你使用szBuffer作为格式字符串(第二个参数)。