首页 > 系统相关 >C++ 指针进阶:动态内存与复杂应用

C++ 指针进阶:动态内存与复杂应用

时间:2024-12-24 19:58:39浏览次数:6  
标签:进阶 int C++ 内存 动态内存 new ptr 指针

1. 动态内存分配:new 与 delete 运算符

在 C++ 编程中,动态内存分配是一项至关重要的技术,它允许我们在程序运行时根据实际需求分配和释放内存。new运算符用于在堆内存中分配内存,delete运算符则用于释放通过new分配的内存。

当我们需要动态分配单个变量时,可以这样使用new

int *ptr = new int;
*ptr = 100;

这里new int在堆内存中分配了一块存储int类型数据的空间,并返回该空间的地址,赋值给ptr。之后,通过*ptr对这块内存进行赋值。

如果要动态分配一个数组,语法稍有不同:

int *arr = new int[10];
for (int i = 0; i < 10; ++i) {
    arr[i] = i * 3;
}

new int[10]在堆内存中分配了一个包含 10 个int类型元素的数组,并返回数组首元素的地址给arr

使用完动态分配的内存后,必须及时释放,以避免内存泄漏。对于单个变量,使用delete释放:

delete ptr;

 对于动态分配的数组,则使用delete[]

delete[] arr;

注意,deletedelete[]的使用必须与newnew[]相对应,否则可能导致未定义行为。

2. 指针与函数:传递与返回

指针在函数间的传递和返回是非常常见且强大的应用。通过传递指针,函数可以直接操作调用者提供的变量,而无需进行值拷贝,从而提高效率。

例如,编写一个交换两个整数的函数,使用指针作为参数:

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

 调用该函数时,传递变量的地址:

int num1 = 5, num2 = 10;
swap(&num1, &num2);

这样,函数内部通过指针直接修改了num1num2的值。

函数也可以返回指针,但需要注意返回的指针所指向的内存必须是有效的。例如:

 

int* createArray(int size) {
    int *arr = new int[size];
    for (int i = 0; i < size; ++i) {
        arr[i] = i + 1;
    }
    return arr;
}

 

在使用这个返回指针的函数时,要记得在合适的时候释放内存,避免内存泄漏。

3. 指针与面向对象编程:this 指针

在 C++ 的面向对象编程中,this指针是一个隐含的指针,它指向当前对象。每个非静态成员函数都有一个this指针,通过它可以访问对象的成员变量和成员函数。

class MyClass {
private:
    int value;
public:
    MyClass(int val) : value(val) {}
    int getValue() {
        return this->value;
    }
};

 

getValue函数中,this->value明确地表示访问当前对象的value成员变量。虽然在这种简单情况下,this指针可以省略,但在更复杂的场景中,比如在函数参数与成员变量同名时,this指针就显得尤为重要。

4. 智能指针:管理动态内存的新方式

随着 C++ 的发展,智能指针的出现为动态内存管理提供了更安全、便捷的方式。智能指针是一种模板类,它会自动管理所指向的动态内存的生命周期。

例如,std::unique_ptr是一种独占式的智能指针,当它离开作用域时,会自动释放所指向的内存:

#include <memory>
std::unique_ptr<int> ptr(new int(20));

这里std::unique_ptr<int>创建了一个指向int类型的智能指针,当ptr离开其作用域时,所指向的内存会自动被释放。

std::shared_ptr则允许多个指针共享同一块动态内存,通过引用计数来管理内存的释放。当引用计数降为 0 时,内存自动释放。

std::shared_ptr<int> ptr1(new int(30));
std::shared_ptr<int> ptr2 = ptr1;

在这个例子中,ptr1ptr2共享同一块内存,当ptr1ptr2都不再使用(引用计数为 0)时,内存才会被释放。

5. 总结

C++ 指针在动态内存分配、函数操作、面向对象编程等方面都有着广泛而深入的应用。理解并掌握指针的这些进阶特性,能够让我们编写出更高效、更健壮的 C++ 程序。同时,智能指针的引入为动态内存管理带来了新的思路,大大降低了内存泄漏的风险。希望读者在实际编程中不断实践,熟练运用指针的各种技巧。

标签:进阶,int,C++,内存,动态内存,new,ptr,指针
From: https://blog.csdn.net/m0_74620645/article/details/144701717

相关文章

  • C++ 指针基础:开启内存操控之门
    1.指针为何如此重要在C++编程领域,指针堪称一项极为关键的特性。它赋予了程序员直接访问和操控内存的能力,这使得程序在处理复杂数据结构与优化性能时具有更高的灵活性。想象一下,在编写大型程序时,高效地管理内存资源是多么重要,而指针就是实现这一目标的有力工具。例如,在处理......
  • [C++] 小游戏 能量 1.1.1 版本 zty出品
    前言今天zty带来的是能量1.1.1版本,好久没出游戏啦,大家给个赞呗,zty还要上学,发作品会少一点                           先 赞 后 看  养  成 习 惯               ......
  • 职工信息管理系统 C++课程设计
    课程设计课程名称:C++课程设计设计课题:职工信息管理系统指导教师:总评成绩:专业:软件工程班级:姓名:学号:二O二四年六月三十日目录第一章课设目标、内容及要求11.1课设目标11.2课程设计内容和要求11.2.1需求分析11.2.2系统功能11.2.3设计要......
  • C++竞赛题
    题目一:小苹果题目描述:小明有一堆苹果,他想将这些苹果分给几个朋友。每个朋友得到的苹果数量必须是连续的自然数,且总和等于小明拥有的苹果总数。请计算有多少种不同的分配方式。输入格式:第一行包含一个整数N,表示苹果的总数。输出格式:输出一个整数,表示分配方式的总数。样......
  • 继承中成员变量和成员方法的访问特点-java se进阶篇 day01
    1.继承中成员变量的访问特点1.成员变量重名如图父类中有age变量,子类中也有age变量,这时打印age,出现的是10还是20呢?答:根据就近原则,出现的是202.使用父类成员变量--super如果就要使用父类中的age该怎么办?使用super关键字进行解决super关键字可以访问父类中的成员,从而解决......
  • 【进阶编程】代理模式和适配模式的比较
    代理模式和适配器模式(AdapterPattern)都属于结构型设计模式,它们在某些方面有相似之处,都涉及到为其他对象提供间接访问和包装,但它们的核心目的是不同的。下面是对代理模式和适配器模式的详细比较:1.目的代理模式(ProxyPattern):代理模式的目的是通过一个代理对象来控制对......
  • 【C++boost::asio网络编程】有关服务端退出方法的笔记
    有关服务端退出方法的笔记C风格的信号关闭boost::asio中的关闭方式原来服务端的main函数如下intmain(){ try { boost::asio::io_contextioc; Servers(ioc,8888); ioc.run(); } catch(conststd::exception&) { } return0;}  上面弊端在......
  • 实验六c++
    实验任务四源代码Vector.hpp1#include<iostream>2#include<stdexcept>3usingnamespacestd;45template<typenameT>6classVector{7public:8Vector(intn);9Vector(intn,Ta);10Vector(constVector<T>&......
  • 模拟法练习C++ 2
    1. 陶陶摘苹果题目描述陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高......
  • 模拟法练习C++ 1
    有错请指出!对于模拟法,百度定义是其实,没有这么麻烦,也就是题目是什么,我们就怎么写,也可以说它是不是算法的算法,最好把代码模块化特点:1.题目简单,代码量很大2.不好找错误3.在比赛中经常考 4.代码灵活下面是几道例题1.扑克游戏题目描述三张扑克牌比大小,每个人从扑克牌中......