std::string 预申请内存
时间: 2023-11-16 18:06:03 浏览: 41
在 C++ 中,可以使用 `reserve()` 函数来预申请 `std::string` 类型的内存,即在未添加字符前预先分配一定的内存空间。这样可以避免频繁的申请、释放内存,提高程序运行效率。
例如:
```c++
std::string s;
s.reserve(100); // 预分配100个字符的内存空间
s += "hello, world!"; // 此时不会触发内存重新分配的操作
```
相关问题
string申请动态内存c++
在C++中,可以使用关键字new和delete来动态申请和释放内存。具体步骤如下:
1. 使用new关键字申请内存,返回指向该内存的指针。例如,申请一个长度为10的字符串数组:
```c++
char* str = new char[10];
```
2. 检查内存是否分配成功。如果分配失败,new会抛出std::bad_alloc异常。可以使用try-catch语句来捕获异常并处理。
3. 使用内存。例如,将字符串"hello"复制到申请的内存中:
```c++
strcpy(str, "hello");
```
4. 使用完内存后,使用delete关键字释放内存。例如:
```c++
delete[] str;
```
注意事项:
1. 使用new申请的内存必须使用delete释放,否则会导致内存泄漏。
2. 申请的内存大小必须是非负整数。
3. 在使用指针之前,必须检查指针是否为空。
4. 在释放内存后,指针不再指向有效的内存地址,应该将其设置为nullptr。
代码示例:
```c++
#include <iostream>
#include <cstring>
int main() {
char* str = nullptr;
try {
str = new char[10];
} catch (std::bad_alloc& e) {
std::cerr << "Memory allocation failed: " << e.what() << std::endl; return 1;
}
std::strcpy(str, "hello");
std::cout << str << std::endl;
delete[] str;
str = nullptr;
return 0;
}
```
分析这段代码#include <iostream>#include <string>#include <cstdlib> #define stepLength 3 //定义学生信息长度的增长步长struct stu { //定义学生信息结构,简单起见只简单包含学生名字(字符串)和年龄(整型) std::string name; //姓名 int age; //年龄};int maxSize = 5; //定义当前学生信息的最大长度int counter = 0; //当前仓库中的学生信息数目stu* storage; //定义学生信息的存储仓库void add(std::string, int); //定义添加学生的函数int main() { storage = new stu[maxSize]; //初始化仓库,申请能存储max个学生信息结构体的空间 for (int i = 0; i <= 9; i++) { //添加10个学生信息 std::string name = "姓名" + std::to_string(i); int age = rand() % 5 + 17; add(name, age); } //打印学生的信息 std::cout << "+--------------学生信息列表 ------------+" << std::endl; for (int i = 0; i < counter; i++) { std::cout << "姓名: " << storage[i].name << ", 年龄: " << storage[i].age << std::endl; } delete[] storage; //释放申请的空间。 return 0;}void add(std::string name, int age) { if (counter < maxSize) { //判断当前学生信息的数目,若小于仓库大小,说明还有空间,则直接添加学生信息 storage[counter].name = name; storage[counter].age = age; counter++; std::cout << "学生-->name: " << name << ", 年龄: " << age << " 添加完毕..." << std::endl; } else { std::cout << "空间不足,正在申请空间..." << std::endl; int newMax = maxSize + stepLength; stu* newStorage = new stu[newMax]; for (int i = 0; i < counter; i++) { newStorage[i].name = storage[i].name; newStorage[i].age = storage[i].age; } }}
这段代码定义了一个名为`stu`的结构体,包含了学生的姓名和年龄两个成员变量。然后定义了一个指向`stu`的指针`storage`,并使用`new`运算符动态申请了一个大小为`maxSize`的`stu`数组作为存储仓库。在`main`函数中,使用循环添加了10个学生信息到`storage`中,并使用`counter`变量记录添加的学生信息数目。当添加学生信息时,如果当前学生信息的数目小于仓库大小,则直接添加学生信息。如果仓库已满,则申请一个新的大小为`maxSize+stepLength`的`stu`数组,并将原有的学生信息拷贝到新数组中,最后释放原有的`storage`指向的内存空间。最后,通过循环打印出添加的学生信息列表。这段代码的主要目的是演示动态内存分配的使用方法,以及如何扩展数组的大小。