目录
3.2 basic_string 中的 new (extra)
一、揭开 C++ 内存管理的神秘面纱
在 C++ 的世界里,内存管理就像是一场精密的舞蹈,每一个动作都关乎程序的性能与稳定。它不仅仅是简单地分配和释放内存,更是对程序资源的高效利用与精心呵护。C++ 提供了一系列内存分配函数,其中malloc、calloc、realloc等是 C 语言风格的内存分配函数,而new和delete则是 C++ 的运算符,用于动态内存分配与释放 。
malloc函数用于向系统申请分配指定字节数的内存空间,返回一个指向该内存块的指针。如果分配成功,它就像一位可靠的快递员,准确地将内存地址送到你手中;若分配失败,就会返回NULL,仿佛在告诉你 “此路不通”。例如,当我们需要一个存放 10 个整数的空间时,可以这样使用:
int* p = (int*)malloc(10 * sizeof(int));
if (p == NULL) {
// 处理内存分配失败的情况
perror("malloc");
exit(-1);
}
而calloc函数,它不仅分配内存,还会贴心地将分配的内存空间初始化为零,就像一个贴心的管家,把房间打扫得干干净净再交给你。其使用方式与malloc类似,只是参数有所不同:
int* q = (int*)calloc(10, sizeof(int));
if (q == NULL) {
perror("calloc");
exit(-1);
}
realloc函数则是内存管理中的 “魔术师”,它可以重新分配先前分配的内存块大小,让内存空间能根据你的需求灵活变化。比如,你一开始申请的空间太小,之后需要更多空间时,就可以使用realloc来调整:
int* r = (int*)malloc(5 * sizeof(int));
// 使用r指向的内存
r = (int*)realloc(r, 10 * sizeof(int));
if (r == NULL) {
perror("realloc");
exit(-1);
}
在 C++ 中,new和delete运算符则更具面向对象的特色。new在分配内存的同时,还会调用对象的构造函数进行初始化,为对象的诞生做好全方位准备;delete则在释放内存时,调用对象的析构函数,清理对象的后事 。例如:
class MyClass {
public:
MyClass() {
// 构造函数
}
~MyClass() {
// 析构函数
}
};
MyClass* obj = new MyClass();
delete obj;
basic_string作为 C++ 标准库中用于处理字符串的类,其内存管理也与上述机制紧密相关 。当我们使用basic_string时,它内部会根据字符串的长度动态分配内存来存储字符。而basic_string使用new(extra)扩充申请量这一操作,更是在内存管理的舞台上扮演着独特的角色,接下来我们就深入探究它的奥秘。
二、探索 basic_string 的内存奥秘
basic_string作为 C++ 标准库中处理字符串的核心类,就像是一个智能的字符串管家,为我们处理字符串相关的各种事务 。它在<string>头文件中定义,是一个模板类,其定义形式为template< class CharT, class Traits = char_traits<CharT>, class Allocator = allocator<CharT> > class basic_string; 。其中,CharT表示字符类型,常见的如char(对应string)和wchar_t(对应wstring);Traits用于定义字符的特性和操作方式;Allocator则负责内存的分配与管理 。
在字符串操作的舞台上,basic_string承担着至关重要的角色。当我们进行字符串的拼接时,它能巧妙地管理内存,确保新字符串的正确存储。比如:
std::string str1 = "Hello";
std::string str2 = "World";
std::string r