标题: 对象的创建和释放
1. 类的实例化(创建对象)通常有两种方式
栈上实例化: 通过直接声明一个对象,对象会被分配在栈上。 (普通对象)
堆上实例化: 使用 new 操作符在堆上分配内存来创建对象,返回对象的指针。(指针对象)
(1)栈上 创建和释放:实例化为普通变量对象
创建: 类名 对象名 ;
如: Student qjl; 使用 . 操作符访问成员变量。
释放: 对象是栈上的,销毁时会自动释放内存。
#include <iostream>
class Student
{
public:
int id;
std::string name;
/*
使用 std::string 类型时,你可以直接进行字符串的赋值、连接、截取等操作,而不需要手动管理字符串的内存。
std::string 会自动处理字符串的内存分配和释放,减少了内存管理的复杂性,并提供更好的安全性。
使用 char* 时,你需要手动分配和释放内存,以确保字符串的正确存储和释放。
*/
};
int main() {
// 栈上实例化
Student qjl;
qjl.id = 1;
qjl.name = "QJL";
// 使用对象
std::cout << "ID: " << qjl.id << ", Name: " << qjl.name << std::endl;
return 0;
}
(2)堆上 创建和释放:实例化为指针变量对象
概念:你可以使用 new 操作符来动态创建对象,且delete 操作符用于释放通过 new 操作符动态分配的内存。动态创建对象通常在堆上分配内存,而释放对象则是通过释放该内存。
创建: 类名 *对象名= new 类名();
如:Student *qjl = new Student(); 使用 -> 操作符访问成员变量。
释放: 对象是堆上的,销毁时用delete操作符释放内存。如delete 对象名;
#include <iostream>
class Student
{
public:
int id;
std::string name;
char *name2;
/*
使用 std::string 类型时,你可以直接进行字符串的赋值、连接、截取等操作,而不需要手动管理字符串的内存。
std::string 会自动处理字符串的内存分配和释放,减少了内存管理的复杂性,并提供更好的安全性。
使用 char* 时,你需要手动分配和释放内存,以确保字符串的正确存储和释放。
*/
};
int main() {
// 堆上实例化
Student *qjl = new Student();
qjl->id = 1;
qjl->name = "QJL";
// 使用对象
std::cout << "ID: " << qjl->id << ", Name: " << qjl->name << std::endl;
// 释放内存
delete qjl;
return 0;
}
2. 常见的free 函数是什么?
在C++中,free 函数不是用于释放类对象的内存的,而是用于释放由 malloc、calloc 或 realloc 等 C 标准库函数分配的变量的动态内存。
例如:
#include <stdio.h>
#include <stdlib.h>
int main() {
// 使用 malloc 分配动态内存
int *dynamicArray = (int *)malloc(5 * sizeof(int));
if (dynamicArray == NULL) {
fprintf(stderr, "Memory allocation failed\n");
return 1; // 返回错误代码
}
// 初始化动态数组
for (int i = 0; i < 5; ++i) {
dynamicArray[i] = i * 2;
}
// 使用动态数组
for (int i = 0; i < 5; ++i) {
printf("%d ", dynamicArray[i]);
}
// 释放动态分配的内存
free(dynamicArray);
return 0;
}