C++内存申请和释放

C++内存管理

c 语言中提供了 malloc 和 free 两个系统函数,完成对堆内存的申请和释放。而 c++则
提供了两关键字 new 和 delete ;

new/delete

new/new[]用法:

int *p = new int; //开辟大小为 sizeof(int)空间

int *a = new int(5); //开辟大小为 sizeof(int)空间,并初始化为 5

// todo new/delete

#include <iostream> //<iostream>
using namespace std; //
int main() {

    //单变量
    int *p=new int(20);
    cout<<*p<<endl; //20
    *p=10;
    cout<<*p<<endl; //10

    string *s=new string("hello");
    cout<<*s<<endl; //hello
    *s="world";
    cout<<*s<<endl; //world


    struct Sut{
        int age;
        string name;
    };
    Sut* s1=new Sut;
    s1->age=20;
    s1->name="Tom";
    cout<<s1->age<<endl; //20
    cout<<s1->name<<endl; //Tom


    Sut* s2=new Sut{10,"Jerry"};
    cout&
### 动态内存管理概述 在C++中,`new`用于动态分配内存并返回指向该内存的指针,而`delete`则负责释放由`new`分配的内存。如果未正确管理动态分配的内存,则可能会引发诸如内存泄漏、野指针或重复释放等问题[^1]。 #### 使用 `new` `delete` 当使用`new`分配单个对象时,会自动调用其构造函数;而在使用`delete`释放此对象时,也会自动调用其析构函数。以下是基本语法: ```cpp int* pInt = new int; // 分配一个整数的空间 *pInt = 10; delete pInt; // 删除整数空间,并调用析构函数(若有) ``` 对于数组类型的动态分配释放,应分别使用`new[]``delete[]`。这是因为`new[]`不仅为每个元素分配了空间,还可能调用了多个构造函数,因此需要用`delete[]`来逐一销毁这些对象。 ```cpp int* pArray = new int[5]; // 分配五个整数的空间 for(int i=0;i<5;i++) { pArray[i] = i * 2; } delete[] pArray; // 正确删除整个数组 ``` #### 避免常见的陷阱 为了防止潜在问题的发生,在实际开发过程中应当遵循以下几点建议: - **避免多次释放同一块内存**:一旦某段内存已被释放,再次尝试对其执行`delete`操作将会导致未定义行为。 - **及时清理不再使用的资源**:任何经由`new`创建的对象都应在适当时候通过对应的`delete`语句予以回收,从而避免造成不必要的浪费即所谓的“内存泄露”。 - **区分单一对象与数组形式的操作符**:针对不同情况选用恰当的形式(`new/delete` vs. `new[]/delete[]`)至关重要[^2]。 #### 推荐做法——采用智能指针 尽管手动处理动态内存看似简单明了,但在复杂项目环境下却容易出错。为此,现代C++引入了智能指针的概念作为传统裸指针的有效补充甚至替代品之一。其中最常用的三种类型分别为`std::unique_ptr`, `std::shared_ptr` 及 `std::weak_ptr`[^3]。 利用标准库提供的智能指针可以帮助开发者更轻松地完成原本繁琐的任务,同时极大程度降低了因人为失误而导致的风险隐患。 ```cpp #include <memory> // unique_ptr 示例 { std::unique_ptr<int> uptr(new int); *uptr = 42; } // 当作用域结束时,unique_ptr 自动释放所拥有的资源 // shared_ptr 示例 std::shared_ptr<int> sptr1 = std::make_shared<int>(8); std::shared_ptr<int> sptr2 = sptr1; // 复制计数值增加至2 if(sptr2.unique()) { /* ... */ } // 如果只有一个owner,则返回true ``` 以上展示了如何借助智能指针简化程序逻辑的同时增强系统的可靠性[^4]。 #### 总结 合理运用`new`与`delete`能够赋予程序员极大的灵活性去操控计算机内部结构,然而这也伴随着相应的责任。只有充分认识到可能出现的各种状况,并采取相应措施加以防范才能真正发挥好这一特性带来的优势[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可能只会写BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值