【C】memory 详解
<memory.h>
是一个 C 标准库头文件,提供了一组内存管理函数,用于分配、释放和操作动态内存。这些函数主要操作的是未初始化的内存块,是早期 C 编程中常用的内存操作工具。
尽管在现代 C++ 编程中更推荐使用<cstring>
或<memory>
,但<memory.h>
在兼容性和某些低级场景下仍然可能被使用。
以下是对<memory.h>
中核心内容的详解:
核心功能与函数
memory
void* memcpy(void* dest, const void* src, size_t n);
- 功能: 将
n
字节的数据从源地址src
复制到目标地址dest
。 - 注意事项:
- 源地址和目标地址不能重叠,如果存在重叠,行为未定义。
- 通常用于快速内存复制。
- 示例:
char src[] = "hello";
char dest[10];
memcpy(dest, src, sizeof(src));
memmove
void* memmove(void* dest, const void* src, size_t n);
- 功能: 将
n
字节的数据从源地址src
移动到目标地址dest
。 - 区别于
memcpy
: 允许源地址和目标地址重叠。 - 示例:
char buffer[] = "abcdef";
memmove(buffer+2, buffer, 4);// 缓冲区重叠
memset
void* memset(void* ptr, int value, size_t n);
- 功能: 将内存块
ptr
的前n
字节设置为指定的值value
(按字节操作)。 - 常用场景: 清零或初始化内存块。
- 示例:
char buffer[10];
memset(buffer, 0, sizeof(buffer));// 将整个缓冲区清零
memcmp
int memcmp(const void* ptr1, const void* ptr2, size_t n);
- 功能: 比较两块内存的前
n
字节。 - 返回值:
0
:两块内存相等。< 0
:ptr1
小于ptr2
。> 0
:ptr1
大于ptr2
。
- 示例:
char a[] = "abc";
char b[] = "abc";
if(memcmp(a, b, 3) == 0) {
printf("Equal\n");
}
malloc
void* malloc(size_t size);
- 功能: 分配
size
字节的动态内存,返回指向该内存块的指针。 - 注意: 返回的内存未初始化,可能包含垃圾值。
- 示例:
int* arr = (int*)malloc(10 * sizeof(int));
calloc
void* calloc(size_t num, size_t size);
- 功能: 分配可以存储
num
个元素的动态内存,并初始化为零。 - 区别于
malloc
: 自动清零。 - 示例:
int* arr = (int*)calloc(10, sizeof(int)); // 分配10个int,初始化为0
realloc
void* realloc(void* ptr, size_t new_size);
- 功能: 调整已分配内存的大小。
- 注意:
- 如果
ptr
为NULL
,行为类似于malloc
。 - 如果
new_size
为0,行为类似于free
。 - 可能返回新地址(原地址不一定保留)。
- 如果
- 示例:
int* arr = (int*)malloc(10 * sizeof(int));
arr = (int*)realloc(arr, 20 * sizeof(int)); // 扩展到 20 个int
free
void free(void *ptr);
- 功能: 释放由
malloc
、calloc
或realloc
分配的动态内存。 - 注意:
- 如果传递
NULL
,free
不会产生任何操作。 - 释放后,指针应置为
NULL
,以避免悬空指针问题。
- 如果传递
- 示例:
int* arr = (int*)malloc(10 * sizeof(int));
free(arr);
arr = NULL;// 避免悬空指针
内存管理注意事项
- 内存泄漏:
- 动态分配的内存必须由程序员显式释放。
- 释放后不要再使用该内存块(避免“悬空指针”)
- 指针安全:
- 初始化指针为
NULL
,并在释放后将指针设置为NULL
。
- 初始化指针为
- 越界访问:
- 确保访问的内存块不超过已分配大小。
- 性能考虑:
- 动态内存分配有一定开销,频繁分配和释放可能影响性能。
<memory.h>
和 <string.h>
的区别
<memory.h>
是 C 语言标准的传统头文件,主要定义了内存管理和操作相关函数。<string.h>
是 C 标准中更常用的头文件,包含了一些字符串处理相关的函数,例如strcpy
、strcat
等。- 在现代C++中,推荐使用
<cstring>
来替代<memory.h>
。
<memory.h>
的现代替代
在 C++ 中,更推荐使用标准模板库(STL)和智能指针(std::unique_ptr
,std::shared_ptr
)进行内存管理,从而减少手动操作动态内存的风险。
示例:
#include <memory>
#include <iostream>
int main() {
auto ptr = std::make_unique<int[]>(10); // 自动管理内存
for(int i=0; i<10; ++i) {
ptr[i] = i * i;
std::cout << ptr[i] << " ";
}
return 0;
}
总结
<memory.h>
提供了低级别的内存操作工具,适合在对性能和资源管理有较高要求的场景中使用。但在现代 C++ 编程中,更推荐使用高层抽象工具,如STL容器和智能指针,来提高代码的可读性和安全性。
原文地址:https://blog.csdn.net/u013090854/article/details/145261491
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!