備案 添加網(wǎng)站網(wǎng)站可以自己建立嗎
<memory.h>
是一個 C 標準庫頭文件,提供了一組內(nèi)存管理函數(shù),用于分配、釋放和操作動態(tài)內(nèi)存。這些函數(shù)主要操作的是未初始化的內(nèi)存塊,是早期 C 編程中常用的內(nèi)存操作工具。
盡管在現(xiàn)代 C++ 編程中更推薦使用<cstring>
或<memory>
,但<memory.h>
在兼容性和某些低級場景下仍然可能被使用。
以下是對<memory.h>
中核心內(nèi)容的詳解:
核心功能與函數(shù)
memory
void* memcpy(void* dest, const void* src, size_t n);
- 功能: 將
n
字節(jié)的數(shù)據(jù)從源地址src
復(fù)制到目標地址dest
。 - 注意事項:
- 源地址和目標地址不能重疊,如果存在重疊,行為未定義。
- 通常用于快速內(nèi)存復(fù)制。
- 示例:
char src[] = "hello";
char dest[10];
memcpy(dest, src, sizeof(src));
memmove
void* memmove(void* dest, const void* src, size_t n);
- 功能: 將
n
字節(jié)的數(shù)據(jù)從源地址src
移動到目標地址dest
。 - 區(qū)別于
memcpy
: 允許源地址和目標地址重疊。 - 示例:
char buffer[] = "abcdef";
memmove(buffer+2, buffer, 4); // 緩沖區(qū)重疊
memset
void* memset(void* ptr, int value, size_t n);
- 功能: 將內(nèi)存塊
ptr
的前n
字節(jié)設(shè)置為指定的值value
(按字節(jié)操作)。 - 常用場景: 清零或初始化內(nèi)存塊。
- 示例:
char buffer[10];
memset(buffer, 0, sizeof(buffer)); // 將整個緩沖區(qū)清零
memcmp
int memcmp(const void* ptr1, const void* ptr2, size_t n);
- 功能: 比較兩塊內(nèi)存的前
n
字節(jié)。 - 返回值:
0
:兩塊內(nèi)存相等。< 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
字節(jié)的動態(tài)內(nèi)存,返回指向該內(nèi)存塊的指針。 - 注意: 返回的內(nèi)存未初始化,可能包含垃圾值。
- 示例:
int* arr = (int*)malloc(10 * sizeof(int));
calloc
void* calloc(size_t num, size_t size);
- 功能: 分配可以存儲
num
個元素的動態(tài)內(nèi)存,并初始化為零。 - 區(qū)別于
malloc
: 自動清零。 - 示例:
int* arr = (int*)calloc(10, sizeof(int)); // 分配10個int,初始化為0
realloc
void* realloc(void* ptr, size_t new_size);
- 功能: 調(diào)整已分配內(nèi)存的大小。
- 注意:
- 如果
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
分配的動態(tài)內(nèi)存。 - 注意:
- 如果傳遞
NULL
,free
不會產(chǎn)生任何操作。 - 釋放后,指針應(yīng)置為
NULL
,以避免懸空指針問題。
- 如果傳遞
- 示例:
int* arr = (int*)malloc(10 * sizeof(int));
free(arr);
arr = NULL; // 避免懸空指針
內(nèi)存管理注意事項
- 內(nèi)存泄漏:
- 動態(tài)分配的內(nèi)存必須由程序員顯式釋放。
- 釋放后不要再使用該內(nèi)存塊(避免“懸空指針”)
- 指針安全:
- 初始化指針為
NULL
,并在釋放后將指針設(shè)置為NULL
。
- 初始化指針為
- 越界訪問:
- 確保訪問的內(nèi)存塊不超過已分配大小。
- 性能考慮:
- 動態(tài)內(nèi)存分配有一定開銷,頻繁分配和釋放可能影響性能。
<memory.h>
和 <string.h>
的區(qū)別
<memory.h>
是 C 語言標準的傳統(tǒng)頭文件,主要定義了內(nèi)存管理和操作相關(guān)函數(shù)。<string.h>
是 C 標準中更常用的頭文件,包含了一些字符串處理相關(guān)的函數(shù),例如strcpy
、strcat
等。- 在現(xiàn)代C++中,推薦使用
<cstring>
來替代<memory.h>
。
<memory.h>
的現(xiàn)代替代
在 C++ 中,更推薦使用標準模板庫(STL)和智能指針(std::unique_ptr
,std::shared_ptr
)進行內(nèi)存管理,從而減少手動操作動態(tài)內(nèi)存的風險。
示例:
#include <memory>
#include <iostream>int main() {auto ptr = std::make_unique<int[]>(10); // 自動管理內(nèi)存for(int i=0; i<10; ++i) {ptr[i] = i * i;std::cout << ptr[i] << " ";}return 0;
}
總結(jié)
<memory.h>
提供了低級別的內(nèi)存操作工具,適合在對性能和資源管理有較高要求的場景中使用。但在現(xiàn)代 C++ 編程中,更推薦使用高層抽象工具,如STL容器和智能指針,來提高代碼的可讀性和安全性。