我通常用c ++编程,但是我的char *使用了一些clibrary函数。 一些像'getline'这样的联机帮助页说,输入应该是一个malloced数组。
是否可以使用'new'代替?
我可以看到我的小样本它可以工作,但是在某种程度上这可能导致一些奇怪的未定义行为吗?
我知道'new'应该与'delete'匹配,'malloc'与'free'匹配。
我也没有使用std :: string。这是故意的。
由于
答案 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::string
和getline
。
答案 2 :(得分:1)
为此目的,有一个'new'ed数组而不是'malloc'ed数组是完全没问题的。
两者之间的差异是(列出其中一些):
这些事情不会对你的计划产生太大的影响;如上所述,去“新”
是完全可以的除非new或malloc失败,否则你的代码不会失败,在这种情况下,'new'抛出异常,malloc返回一个NULL指针。
编辑:为此,数组必须为'malloc'。我想我当时错了!谢谢马丁! :)