C++ primer plus 学习 4.8 new&delete与存储空间

程序4.22

#include<iostream>
#include<cstring>
using namespace std;

// 按照输入的字符串的长度来分配内存空间
char* getname(void){
    // 最大长度79
    char tmp[80];   // tmp自动存储,在栈中

    cout << "输入字符串: ";
    cin >> tmp;

    // 用于存储的新空间,pn指向
    // new为堆内存,如果采用char p[80]为栈内存,不需要手动释放
    // +1因为要存储\0
    char* pn = new char[strlen(tmp)+1];

    // char * strcpy(char * dest,const char * src);
    strcpy(pn, tmp);
    return pn;
}

int main(){
    char* name = getname();
    // name是地址,cout在打印char*时,会打印字符,直到\0
    // (int*)name会打印地址
    cout << name << " at " << (int*)name << endl;
    // 释放的不止name地址,而是name后面的一片地址,所以加上[]
    delete [] name;
    return 0;
}

踩坑及知识点:

  1. 使用char数组开辟空间时,长度为strlen+1,因为最后的结束符\0也占一个空间
  2. strcpy为复制字符串函数,参数为char*,而字符串字面值也是指向首元素的常量指针,所以也可以strcpy(pn, "pen");
  3. char* name,cout在遇到char*时,自动往后打印字符,直到遇到\0,所以cout << name即可,如需打印地址,则为(int*) name
  4. 避免重复释放,如char *name与pn指向了同一块空间,释放了name之后,不可释放pn
  5. C++三种管理内存方式:
    1. 自动存储,如代码中tmp,函数内部定义的常规变量,随代码块消亡,存在栈中
    2. 静态存储,在函数外面定义的,或者static定义的,存在于整个程序的周期
    3. 动态存储,new&delete,更灵活的让程序员控制内存,存在堆中,但可能导致存储空间不连续。如果没有delete,可能内存泄漏,即指针被释放(随代码块),但空间没有释放,且无法访问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值