常用函数的使用错题汇总
目录
- new/delete malloc/free
- 1. 语言和类型
- 2. 内存分配
- 3. 内存释放
- 4. 安全性和类型安全
- 5. 其他特性
- 总结
- 线程停止
- 文件流
new/delete malloc/free
malloc/free
和 new/delete
是 C/C++ 中用于动态内存管理的两种方式,它们有一些重要的区别。以下是这两种方式的比较:
1. 语言和类型
-
malloc
/free
:- 属于 C 语言的内存管理函数。
malloc
返回的是void*
类型的指针,调用者需要进行类型转换。- 不会调用构造函数或析构函数,适用于简单的内存分配。
-
new
/delete
:- 属于 C++ 的内存管理操作符。
new
返回的是所请求类型的指针,不需要进行类型转换。- 会自动调用构造函数(
new
)和析构函数(delete
),适用于复杂的对象和类。
2. 内存分配
-
malloc
:- 语法:
void* malloc(size_t size);
- 分配
size
字节的内存块。 - 如果分配失败,返回
NULL
。
- 语法:
-
new
:- 语法:
Type* ptr = new Type;
- 分配足够的内存来存储一个
Type
类型的对象,并调用其构造函数。 - 如果分配失败,抛出
std::bad_alloc
异常。
- 语法:
3. 内存释放
-
free
:- 语法:
void free(void* ptr);
- 释放由
malloc
、calloc
或realloc
分配的内存。 - 不会调用析构函数。
- 语法:
-
delete
:- 语法:
delete ptr;
- 释放由
new
分配的内存,并调用相应对象的析构函数。 - 可以使用
delete[]
来释放由new[]
分配的数组。
- 语法:
4. 安全性和类型安全
-
类型安全:
new
和delete
是类型安全的,编译器会根据类型检查指针的类型。malloc
和free
不提供类型安全,使用时需要手动转换类型。
-
内存泄漏:
- 使用
new
和delete
更容易避免内存泄漏,因为它们会自动调用对象的构造和析构函数,确保资源的正确管理。 - 使用
malloc
和free
,开发者需要手动管理对象的生命周期,容易出现内存泄漏。
- 使用
5. 其他特性
malloc
和free
不能用于分配和释放 C++ 对象的数组,使用时不调用构造函数和析构函数,可能导致资源管理不当。new
和delete
可以配合异常处理机制,允许在分配失败时抛出异常,提供了更好的错误处理模型。
总结
- 在 C++ 中,推荐使用
new
和delete
来进行动态内存管理,以充分利用对象的构造和析构功能以及类型安全的优势。 malloc
和free
适用于 C 语言或需要与 C 兼容的代码,但在 C++ 中使用时要谨慎,确保适当地管理对象的生命周期。
线程停止
文件流
#include <iostream>
#include <fstream>
#include <string>int main() {std::ifstream fin("example.txt"); // 创建 ifstream 对象并打开文件// 检查文件是否成功打开if (!fin) {std::cerr << "Error opening file!" << std::endl;return 1; // 返回错误代码}std::string line;// 逐行读取文件内容while (std::getline(fin, line)) {std::cout << line << std::endl; // 输出读取的每一行}fin.close(); // 关闭文件return 0; // 正常结束程序
}
文件输入输出流