在指针2中提到了怎么用指针申配内存,但是,指针申配的内存不会无缘无故地

被收回。很多poj上的题都是有多组数据,每次地数组大小会不同,所以要重新申请

一块内存。但是原来的内存却不会被收回,也是说2、3组数据玩下去就

MemoryLimitExceeded,所以需要释放指针指向的内存(只要不是什么黑心评测机,

把你程序在运行中所有使用过的内存都进算进去就行)

  这里对于C和C++分别有函数和关键字

  C就使用free(void*)函数,参数只有一个,要释放内存的指针,就像这样使用:

 #include<stdio.h>
#include<malloc.h>
int main(){
int *p = ( int * )malloc( sizeof(int)* );
free(p);
return ;
}

  至于C++的用户就有一点区别了,delete关键字能够解决这个问题,但是指向的是

一个数组的话就有点不一样了,试验一下就是到了:

 #include<iostream>
using namespace std;
typedef class aaa{
public:
aaa(){ cout<<"a"<<endl; }
~aaa(){ cout<<"aaa"<<endl; }
}aaa;
int main(){
aaa *p = new aaa[];
delete p;
aaa *p1 = new aaa[];
delete[] p1;
return ;
}

  在delete p中,析构函数只被执行了一次,而delete[] p1中析构函数被执行了3次,说明delete

只是释放单个对象的内存,delete[]是释放指针指向的数组的内存,这仅是对于用户自定义的类型来说。

对于int等,貌似delete和delete[]差不多

 #include<iostream>
using namespace std;
int *p1;
int *p;
int main(){
p = new int[]; p[] = ;
p[] = ;
p[] = ;
p[] = ;
cout<<p[]<<endl;
delete p;
// cout<<p[99999]<<endl; p1 = new int[];
p1[] = ;
p1[] = ;
p1[] = ;
p1[] = ;
cout<<p[]<<endl;
delete[] p1;
cout<<p1[];
}

  前面(把注释去掉编译运行)和后面都会崩溃,
总而言之,为了防止像上例内存没有完全释放的情况,最好用new申请的内存用delete释放

new[]申请的用delete[]释放

  无论是不是竞赛都要记得用完指针就要释放内存


指针与结构体

  指针的类型基本上可以是任意数据类型(一个*完事),那访问结构体能不能像这样访问:

 #include<iostream>
using namespace std;
struct aaa{
public:
int a;
int b;
}a;
int main(){
aaa *c = new aaa;
c.a = ;
c.b = ;
return ;
}

于是,编译器报错:

  [Error] request for member 'a' in 'c', which is of pointer type 'aaa*' (maybe you meant to use '->' ?)

  指针不加*是内存地址,内存地址又不是结构体,所以从这上面也能知道这样做是错误的,

那稍微改一改。用*访问数据:

    (*c).a = ;
(*c).b = ;

  那刚刚编译器中提到的'->'又是什么鬼?这个相当于是(*xx).的缩略方式,于是,之前的代码

可以写成:

c->a = ;
c->b = ;

(注:这个符号只是提供给指向结构体/类的指针访问结构的数据使用,普通结构体不可以使用)

(第三部分,完)

[c/c++]指针(3)的更多相关文章

  1. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  2. enote笔记法使用范例(2)——指针(1)智能指针

    要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...

  3. C++虚函数和函数指针一起使用

    C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...

  4. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  5. c 数组与指针的使用注意事项

    数组变量和指针变量有一点小小的区别 所以把数组指针赋值给指针变量的时候千万要小心 加入把数组赋值给指针变量,指针变量只会包含数组的地址信息 而对数组的长度一无所知 相当于指针丢失了一部分信息,我们把这 ...

  6. Marshal.Copy将指针拷贝给数组

    lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...

  7. C++智能指针

    引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...

  8. EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针

    一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...

  9. 智能指针shared_ptr的用法

    为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...

  10. 智能指针unique_ptr的用法

    unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...

随机推荐

  1. The third column indicates whether subclasses of the class declared outside this package have access to the member.;

    总结1.modifier 改性剂 修饰符 修饰语 调节器access modifier 访问修饰符 存取权限 存取修饰词 存取修饰字官网“can”Access level modifiers dete ...

  2. 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy nginx反向代理原理和配置讲解 防止外部客户机获取内部内容服务器的重定向 URL 缓存命中

    [大型网站技术实践]初级篇:借助Nginx搭建反向代理服务器 - Edison Chou - 博客园http://www.cnblogs.com/edisonchou/p/4126742.html 图 ...

  3. 【RBAC】打造Web权限控制系统

    引言 权限系统模块对于互联网产品是一个非常重要的功能,可以控制不同的角色合理的访问不同的资源从而达到安全访问的作用 此外本次课程有视频讲解: http://www.imooc.com/learn/79 ...

  4. JAVA中只有值传递

    今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...

  5. 【Jason】Jason拓展

      Java-script是最基础语言(即前端脚本),而jquery是基于javascript封装出来的包,这些包里面含有能调用ajax的方法. ajax是一种异步交互,局部刷新的一种形式,是一种通讯 ...

  6. (3.5)mysql基础深入——mysqld_safe脚本功能及流程

    (3.5)mysql基础深入——mysqld_safe脚本功能及流程 目录 1.mysqld_safe过程总结 2.mysql_safe启动的好处 3.mysqld_safe 参数 4.mysqld_ ...

  7. zabbix 3.2.5 agent端(源码包)安装部署 (二)

    一.zabbix agent 端安装部署 1.创建zabbix用户和组 groupadd zabbix useradd -g zabbix zabbix -s /sbin/nologin 2.解压za ...

  8. mysql备份工具innobackupex,xtrabackup-2.1的原理和安装

    mysql备份工具innobackupex,xtrabackup-2.1的原理和安装 http://bbs.2cto.com/read.php?tid=310496 一.Xtrabackup介绍 1. ...

  9. python2.7 环境配置

    1.安装python2.7.8之后,配置环境变量:在path中配置python的安装路径 在cmd框中执行python,进入到python命令执行,即为配置成功. 2.执行过程中,提示缺少xlutil ...

  10. (转载)【cocos2dx 3.x Lua] 注册事件函数详解

    出处: http://www.2cto.com/kf/201409/338235.html coocs2dx 版本 3.1.1 registerScriptTouchHandler 注册触屏事件 re ...