未充分利用的内存会导致内存泄漏吗?
Does under-utilized memory cause memory leak?
当我们将较少数量的数据复制到较大的(编译时分配的)缓冲区时,strncpy()
是否会导致内存泄漏?换句话说,内存的under-utilization是否可以称为memory leak?
下面是我的代码
#define uk "ln"
int main()
{
char buffer[32];
strncpy(buffer,uk,sizeof(buffer));// IS it memory leak free?
// uk macro has 3 byte of size to
// hold the string but here the
// Attemp of 32 byte is made to copy
// from uk macro to buffer?
}
以上代码是否存在内存泄漏或错误?
memory leak?
No,没有内存泄漏。期间.
如果您不您自己(动态)分配内存,您也不需要释放它。编译器在编译时分配的所有内存,编译器将负责释放这些内存。我们现在可以玩得开心了。
Bug?
是,您没有包含 string.h
,其中包含 strncpy()
.
的前向声明
没有内存泄漏,因为buffer
是一个自动变量。它在退出 main()
.
后不复存在
其实这两个说法
char buffer[32];
strncpy(buffer,uk,sizeof(buffer));
完全等同于以下声明
char buffer[32] = "ln";
这是一个有效的声明,没有错误或内存泄漏。:)
在这两种情况下,buffer
的所有未由字符串文字的字符(或通过复制其字符)初始化的元素都被零初始化。
来自C标准(7.23.2.4 strncpy函数)
3 If the array pointed to by s2 is a string that is shorter than n
characters, null characters are appended to the copy in the array
pointed to by s1, until n characters in all have been written.
一般写成
会更正确
char buffer[32];
strncpy(buffer,uk,sizeof(buffer));
buffer[sizeof( buffer )-1] = '[=12=]';
那是你原来的代码不安全。
当然必须包括 C 中的 header <string.h>
或 C++ 中的 <cstring>
,但我认为您只是忘记为演示示例执行此操作。:).
当我们将较少数量的数据复制到较大的(编译时分配的)缓冲区时,strncpy()
是否会导致内存泄漏?换句话说,内存的under-utilization是否可以称为memory leak?
下面是我的代码
#define uk "ln"
int main()
{
char buffer[32];
strncpy(buffer,uk,sizeof(buffer));// IS it memory leak free?
// uk macro has 3 byte of size to
// hold the string but here the
// Attemp of 32 byte is made to copy
// from uk macro to buffer?
}
以上代码是否存在内存泄漏或错误?
memory leak?
No,没有内存泄漏。期间.
如果您不您自己(动态)分配内存,您也不需要释放它。编译器在编译时分配的所有内存,编译器将负责释放这些内存。我们现在可以玩得开心了。
Bug?
是,您没有包含 string.h
,其中包含 strncpy()
.
没有内存泄漏,因为buffer
是一个自动变量。它在退出 main()
.
其实这两个说法
char buffer[32];
strncpy(buffer,uk,sizeof(buffer));
完全等同于以下声明
char buffer[32] = "ln";
这是一个有效的声明,没有错误或内存泄漏。:)
在这两种情况下,buffer
的所有未由字符串文字的字符(或通过复制其字符)初始化的元素都被零初始化。
来自C标准(7.23.2.4 strncpy函数)
3 If the array pointed to by s2 is a string that is shorter than n characters, null characters are appended to the copy in the array pointed to by s1, until n characters in all have been written.
一般写成
会更正确char buffer[32];
strncpy(buffer,uk,sizeof(buffer));
buffer[sizeof( buffer )-1] = '[=12=]';
那是你原来的代码不安全。
当然必须包括 C 中的 header <string.h>
或 C++ 中的 <cstring>
,但我认为您只是忘记为演示示例执行此操作。:).