malloced数组和新建数组之间有区别吗?

时间:2009-12-28 03:50:29

标签: c++ c arrays malloc new-operator

我通常用c ++编程,但是我的char *使用了一些clibrary函数。 一些像'getline'这样的联机帮助页说,输入应该是一个malloced数组。

是否可以使用'new'代替?

我可以看到我的小样本它可以工作,但是在某种程度上这可能导致一些奇怪的未定义行为吗?

我知道'new'应该与'delete'匹配,'malloc'与'free'匹配。

我也没有使用std :: string。这是故意的。

由于

3 个答案:

答案 0 :(得分:13)

传递给getline()的缓冲区必须被malloced。

原因是如果需要更多空间,getline()可以在缓冲区上调用realloc()。

像free()这样的realloc()只应该与malloc()分配的内存一起使用。这是因为malloc()和new从不同的存储区域分配内存:

请参阅:What is the difference between new/delete and malloc/free?

基本上new使用“The Free Store”,而malloc使用“The Heap”。这两个区域都是“应用程序堆”的一部分(虽然标准实际上并不需要应用程序堆,因为这是一个实现细节)虽然它们都在“应用程序堆”中,但这些区域不需要重叠。它们是否是实现的细节。

getline()的手册页:

注意这一行:

  

或者,在调用getline()之前,* lineptr可以包含指向malloc()的指针 - 分配的缓冲区* n个字节的大小。如果缓冲区不足以容纳该行,则getline()使用realloc()调整其大小,根据需要更新* lineptr和* n。

答案 1 :(得分:2)

是的,当预期“malloced”时,使用分配有new的指针是可以的。

顺便说一句,getline不是ISO C.标准C ++库中有一个getline,但是那个人需要std::string。对于标准C文件读取,您应该使用fgets。以下工作(简化代码假设存在infile并且不检查fgets返回值 - 您可能在实际代码中应该这样做:

// infile is some open FILE* object
int mylen = 100;
char* line = new char[mylen];
fgets(line, mylen, infile)

但是,强制性免责声明:如果您使用的是C ++,最好使用std::stringgetline

答案 2 :(得分:1)

为此目的,有一个'new'ed数组而不是'malloc'ed数组是完全没问题的。

两者之间的差异是(列出其中一些):

  • new / delete调用关联对象的构造函数/析构函数,与malloc / free不同。后者不能执行初始化/去初始化的东西。
  • new返回一个正确类型的指针,但指向malloc返回的指针必须进行类型转换(C ++)
  • new / delete没有与new / delete
  • 不同的realloc替代方案

这些事情不会对你的计划产生太大的影响;如上所述,去“新”

是完全可以的

除非new或malloc失败,否则你的代码不会失败,在这种情况下,'new'抛出异常,malloc返回一个NULL指针。

编辑:为此,数组必须为'malloc'。我想我当时错了!谢谢马丁! :)