结构体指针数组 内存分配 释放

2023-11-04

 

#include <iostream>

#include <vector>

#include <map>

#include <iterator>

#include <algorithm>

 

using namespace std;

 

typedef class student

{

public:

int number;

char* name;

}STU, *LPSTU;

 

vector<LPSTU>vec;

vector<LPSTU>::iterator iter;

 

map<int,LPSTU>mapstu;

map<int,LPSTU>::iterator itermap;

 

void main(void)

{

char* str1 = "YaoMing";

char* str2 = "T_MAC";

char* str3 = "Join";

LPSTU stu[3];

 

for (int n=0; n < 3; n++)

{

stu[n] = new student;

}

 

stu[0]->name = new char[strlen(str1)+1];

strcpy(stu[0]->name,str1);

stu[0]->number = 1;

 

stu[1]->name = new char[strlen(str2)+1];

strcpy(stu[1]->name,str2);

stu[1]->number = 2;

 

stu[2]->name = new char[strlen(str3)+1];

strcpy(stu[2]->name,str3);

stu[2]->number = 3;

 

int i = 0;

for(;i < 3 ; i++)

{

vec.push_back(stu[i]);

mapstu.insert(make_pair(stu[i]->number,stu[i]));

}

for (iter=vec.begin();iter!=vec.end();++iter)

{

cout<< (*iter)->name<<"/t"<< (*iter)->number<<endl;

}

for (itermap = mapstu.begin();itermap != mapstu.end(); ++itermap)

{

cout<<itermap->first<<"/t"<<itermap->second->name<<endl;

}

for( i = 0;i < 3 ; i++)

{

vec.pop_back();

mapstu.erase(stu[i]->number);

}

cout<<vec.size()<<"/t"<<mapstu.size()<<endl;

 

for( i = 0;i < 3 ; i++)

{

delete[] stu[i]->name;

delete stu[i];

}

}

 

 

指针数组:一个数组里存放的都是同一个类型的指针,通常我们把他叫做指针数组。 
比如 int * a[10];它里边放了10个int * 型变量,由于它是一个数组,已经在栈区分配了10个(int * )的空间,也就是32位机上是40个byte,每个空间都可以存放一个int型变量的地址,这个时候你可以为这个数组的每一个元素初始化,在,或者单独做个循环去初始化它。 
例子: 
int * a[2]={ new int(3),new int(4) };     //在栈区里声明一个int * 数组,它的每一个元素都在堆区里申请了一个无名变量,并初始化他们为3和4,注意此种声明方式具有缺陷,VC下会报错 
例如 : 
int * a[2]={new int[3],new int[3]}; 
delete a[0]; 
delet a[10]; 

int * a[2]; 
a[0]= new int[3]; 
a[1]=new int[3]; 
delete a[0]; 
delet a[10]; 
这样申请内存的风格感觉比较符合大家的习惯;由于是数组,所以就不可以delete a;编译会出警告.delete  a[1]; 
注意这里 是一个数组,不能delete [] ; 

 

指针的指针; 
int ** cc=new (int*)[10]; 声明一个10个元素的数组,数组每个元素都是一个int *指针,每个元素还可以单独申请空间,因为cc的类型是int*型的指针,所以你要在堆里申请的话就要用int *来申请; 
看下边的例子  (vc & GNU编译器都已经通过); 
       int ** a= new int * [2];     //申请两个int * 型的空间 
       a[1]=new int[3];        //为a的第二个元素又申请了3个int 型空间,a[1]指向了此空间首地址处 
       a[0]=new int[4];        为a的第一个元素又申请了4个int 型空间,a[0] 指向了此空间的首地址处 
       int * b; 
       a[0][0]=0; 
       a[0][1]=1; 
       b=a[0]; 
  delete [] a[0]       //一定要先释放a[0],a[1]的空间,否则会造成内存泄露.; 
       delete [] a[1]; 
  delete [] a; 
       b++; 
       cout<<*b<<endl;       //随机数 
注意 :因为a 是在堆里申请的无名变量数组,所以在delete 的时候要用delete [] 来释放内存,但是a的每一个元素又单独申请了空间,所以在delete [] a之前要先delete [] 掉 a[0],a[1],否则又会造成内存泄露. 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结构体指针数组 内存分配 释放 的相关文章

  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • iOS 循环对象的属性并添加操作

    我有一个具有几个类似属性的类 UISliders 我想添加用户开始和结束使用每个滑块时的操作 每个滑块都将链接到同一个选择器 因此我考虑只是迭代它们 而不是编写 10 个几乎相同的代码块 问题是 最有效的方法是什么 我尝试过这样的事情 在运
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • 大二第二周总结

    问题 想到了之前追的辩论赛 主题是 被误解是表达者的宿命 反方认为被误解不是表达者的宿命 由于表达者表意含混造成误解的可能性是人力可控的 表达者可在真诚沟通的基础之上 根据对方反应不断调整语言 或者采用表情和肢体等表达方式 对于暂时未理解表
  • 当用了万恶的crontab -r命令后……

    明天计划上个新的应用 需要写脚本获取服务器状态并写入数据库 下午写完脚本 准备先放cron里测试一下 登进服务器 想敲crontab e加一条计划 结果手一滑就敲成了crontab r 然后就悲剧了 因为发现没有备份 没办法 想办法恢复吧
  • redis2txt-获取redis数据并存储到txt文件

    txt文件导入redis 单线程 多线程 list类型 redis cli h ip LRANGE key 0 999999 while read item do echo item gt gt tmp listdata txt done
  • 超全面的语音交互知识总结:从原理、场景到趋势

    1 什么是语音交互 语音交互 VUI 指的是人类与设备通过自然语音进行信息的传递 一次完整的语音交互需要经历ASR NLP Skill TTS的流程 1 ASR 用于将声学语音进行分析 并得到对应的文字或拼音信息 语音识别系统一般分训练和解
  • where not exists 避免重复插入SQL语句

    项目场景 避免重复插入SQL语句 insert into TABLE2 select from TABLE1 where not exists select 1 from TABLE2 where TABLE2 id TABLE1 id a
  • Ubuntu下chgrp的用法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 每天一个linux命令链接 http www cnblogs com peida archive 2012 12 03 2799003 html 实例1 改变文件的群组属性
  • Elasticsearch中 match、match_phrase、query_string和term的区别

    一 text字段和keyword字段的区别 以下给出一个例子 首先建立一个索引和类型 引入一个keywork的字段 PUT my index mappings products properties name type keyword 然后
  • 华为OD机试 Java 实现【计算日期到天数转换】【牛客练习题】

    一 题目描述 根据输入的日期 计算是这一年的第几天 保证年份为4位数且日期合法 二 输入描述 输入一行 每行空格分割 分别是年 月 日 三 输出描述 输出是这一年的第几天 四 Java算法源码 public static void main
  • 200行代码实现Mini ASP.NET Core

    前言 在学习ASP NET Core源码过程中 偶然看见蒋金楠老师的ASP NET Core框架揭秘 不到200行代码实现了ASP NET Core Mini框架 针对框架本质进行了讲解 受益匪浅 本文结合ASP NET Core Mini
  • 逆矩阵的概念、应用和求解

    目录 逆矩阵的概念 求解逆矩阵 应用例子 可能没有逆矩阵 求解逆 方法1 初等行运算 高斯 若尔当 求解逆 方法2 余子式 代数余子式和伴随 求解逆 方法3 程序库 逆矩阵的概念 矩阵运算中 是没有除法的 也就是不能除以一个矩阵 这时就需要
  • C++ 遍历驱动列表(应用层下)

    上代码咯 include stdafx h include
  • (android地图开发) 高德地图手势切换

    效果截图 相关布局文件 手势滑动第一个界面
  • Apache-Arrow是什么?

    Apache Arrow是什么 Arrow是一种数据存储格式 以及对这个格式的一系列API及多语言的SDK 当上层应用使用这个接口访问这些数据的时候 大家就不用在不同的私有格式之间转换 从而省去了大量的序列化和反序列化的计算资源 基础概念
  • PVE虚拟化平台之安装openEuler系统

    PVE虚拟化平台之安装openEuler系统 一 openEuler介绍 1 1 openEuler简介 1 2 openEuler的硬件要求 物理机的安装要求 虚拟机的安装要求 二 下载openEuler系统镜像 2 1 官方网址 2 2
  • MAVEN利器:一文带你了解MAVEN以及如何配置

    前言 强大的构建工具 Maven 作为Java生态系统中的重要组成部分 Maven为开发人员提供了一种简单而高效的方式来构建 管理和发布Java项目 无论是小型项目还是大型企业级应用 Maven都能帮助开发人员轻松处理依赖管理 编译 测试和
  • Jquery添加元素(append,prepend,after,before四种方法区别对比)

    jquery是一个平常比较喜欢用的js框架 因为上手比较简单吧 哈哈 下面呢 就介绍一下Jquery中如何添加元素 jquery添加元素一共有四个语句 分别是append prepend after before append的用法 这个方
  • 神经网络激活函数sigmoid relu tanh 为什么sigmoid 容易梯度消失

    什么是激活函数 为什么要用 都有什么 sigmoid ReLU softmax 的比较 如何选择 1 什么是激活函数 如下图 在神经元中 输入的 inputs 通过加权 求和后 还被作用了一个函数 这个函数就是激活函数 Activation
  • Python爬取58同城广州房源+可视化分析

    感谢关注天善智能 走好数据之路 欢迎关注天善智能 我们是专注于商业智能BI 人工智能AI 大数据分析与挖掘领域的垂直社区 学习 问答 求职一站式搞定 对商业智能BI 大数据分析挖掘 机器学习 python R等数据领域感兴趣的同学加微信 t
  • 如何在Mac电脑上编译Unity项目至iOS simulator (ipad/iphone)

    如何将Unity项目编译成iOS app 并在虚拟的ipad或者iphone上运行呢 大体步骤分为三步 使用Unity生成 xcodeproj 文件 在Xcode中运行 simulator 通过Xcode编译 xcodeproj 文件 并安
  • 结构体指针数组 内存分配 释放

    include