首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

分享丨CC++内存管理详解--堆、栈

函数的return语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。   (3). 使用free或delete释放了内存,没有将指针设置为NULL。...str << endl; } 用调试器逐步跟踪Test4,发现执行str = GetString语句str不再是NULL指针,但是str的内容不是“hello world”而是垃圾。...杜绝“野指针” “野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。...所以,指针变量创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。...对于非内部数据类型的对象而言,new创建动态对象的同时完成了初始化工作。如果对象有多个构造函数,那么new的语句也可以有多种形式。

97321

C++之指针使用

指针和数组对比   C++/C程序中,指针和数组不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。数组要么静态存储区被创建(如全局数组),要么栈上被创建。...人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。   “野指针”的成因主要有三种:   (1)指针变量没有被初始化。...对象创建的同时要自动执行构造函数,对象消亡之前要自动执行析构函数。...因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。...(1)判断指针是否为NULL,如果是则马上用return语句终止本函数。   (2)判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行。

62710
您找到你想要的搜索结果了吗?
是的
没有找到

万字长文【C++】高质量编程指南

4,一行代码只做一件事情,如只定义一个变量,或只写一条语句。 5,尽可能在定义变量的同时初始化该变量。...,以防止该指针函数体内被意外修改。...(2)free或delete释放了内存之后,没有将指针设置为NULL,导致产生了 野指针 8.2.3.指针与数组对比 数组要么静态存储区被创建,如全局数组,要么栈上被创建。...,成为野指针的原因有: 1,指针变量没有被初始化 指针变量创建的同时应当被初始化,要么将指针设置为 NULL,要么让它指向合法的内存。...NULL,不能 return other,因为可能other是个临时对象,赋值结束它马上消失,那么return other返回的将是垃圾。

1.4K20

C++的引用与const指针的关系以及各种传递方式

引用经常作为函数的参数传递,可以与值传递,以及指针传递做个比较: 值传递: 实参初始化形参时要分配空间, 将实参内容拷贝到形参 引用传递: 实参初始化形参时不分配空间 指针传递:本质是值传递,但如果我们要修改指针本身...,那只能使用指针指针了,即 **, 或者指针引用 *& 而且使用指针比较不保险的是很多人会忘记加上const的限制,即很可能接下来的程序中你又把这个指针指向了其他的变量,这样就混乱了。...n2=11 n=7 好像没错是吧,再试试,我们最后加一条语句再打印一下 n2 cout<<"n2="<<n2<<endl; n2=11 n=7 n2=1474313670 奇怪了,<em>为什么</em>这次打印变成这么大的数而我们完全没更改...其实函数返回的是局部变量sum的引用,而 n2 本身又是引用,即引用着原来sum 拥有的那块区域,第一次打印没有出错是因为本来写在sum 区域上的值11 尚未被覆盖,而再运行两条打印<em>语句</em><em>后</em>再次打印,很可能原来属于...大家要比较清晰的是,局部变量<em>在</em>函数栈上释放,但本来区域的值第一时间还是原来的值,但经过程序运行,堆栈内存区域重用, 一般就被覆盖了。

75870

C++入门的基础

其实想要搞明白为什么会出现这种状况,首先要明白的是C++是祖师爷用C语言的过程中,饱受C语言中一些限制的诟病,C语言的基础上增加的一个更牛的系统。...2、命名空间 为什么要有命名空间的这一术语?因为C/C++中,变量,函数以及类都是大量存在的,这些都将存储于全局作用域,那么就可能会引起冲突。...10; // C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决 int main() { printf("%d\n", rand); return 0; } // 编译报错...引用和指针的不同点: 1、引用概念上的定义是变量的别名,指针存储一个变量的地址。 2、引用在定义的时候就必须初始化指针没有要求。...3、引用在初始化时引用一个实体之后,就不能引用其他实体,而指针可以在任何时候指向任何一个同类型的实体。 4、没有NULL引用,但是有NULL指针

13210

【c++】内联-引用-重载

为什么?...引用在定义时必须初始化指针没有要求 引用在初始化时引用一个实体,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 没有NULL引用,但有NULL指针 sizeof中含义不同:引用结果为引用类型的大小...引用比指针使用起来相对更安全 语法上区别 引用是别名,不开空间;指针是地址,需要开辟空间存地址 引用必须初始化指针无要求 引用不能改变指向,指针可以 引用相对更安全,没有空引用,但是有空指针;容易出现野指针...,但是不容易出现野引用 底层区别 汇编层面上,没有引用,都是指针,引用编译也转换成指针了 3....采用C语言编译器编译结果 结论:linux下,采用gcc编译完成,函数名字的修饰没有发生改变 采用C++编译器编译结果 结论:linux下,采用g++编译完成,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改的名字中

6710

C++ 练气期之指针所指之处

千万别问我为什么输出的不是1000。图片只是一个演示。 有了这个地址,可以通过这个地址访问num变量中的数据。...std::cout<<*num_p; //输出:20 需要注意:声明和通过地址访问数据时,都要使用 *符号: 声明时*表示指针类型。...几个问题 3.1 为什么要使用指针变量 使用指针变量时,总会有一个疑问,既然能够使用变量名访问变量,为什么还要搞一个指针变量。指针变量不仅要占用内存空间,且语法繁琐,是不是有点啰嗦了。...如果把这指针变量用于代码逻辑,会产生无中生有的数据,显然是违背数据的准确性和可靠性。 所以,声明指针变量,一定要对其进行初始化。...<<score<<std::endl; std::cout<<*p<<std::endl; //输出 56 56 可以认为指针访问是变量名访问的另一种形式,所以初始化指针变量时, 需要使用 &或 new

31540

C++基础 指针使用注意

下面调试运行: cout语句行加断点,调试运行,同时打开电脑的任务管理器,运行程序,可以在任务管理器中看到内存的占用突然增大(malloc的作用)而后回到正常(free的作用)。...而如果将free语句注释掉,再次调试运行至cout语句处,在任务管理器可以看到内存始终占用较多。如果此时cout语句还要大量代码需要分配内存,可能就会内存分配失败造成程序异常。...注意,野指针不是NULL指针, 它比NULL指针更容易犯错,因为它不能通过形如 if (NULL == p)的判断语句来预防,只能我们自己写代码时多注意。...指针定义初始化 指针定义使用前,需要初始化,否则也是野指针,指向不确定: #include using namespace std; int main(void) {...建议:定义指针变量的时候尽量初始化,哪怕初始化为NULL也好 不应返回局部变量的地址 c/c++中,局部变量是存放在栈中的,它的特点是随函数调用时创建随函数结束时销毁,因此程序中将局部变量的地址返回赋值给一个指针

70110

C++入门必备知识(你真的入门C++了吗?)

为什么?...2.引用在定义时必须初始化指针没有要求 3.引用在初始化时引用一个实体,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 4.没有NULL引用,但有NULL指针 5.sizeof...(关于迭代器这个问题,以后会讲,现在大家了解一下就可以了) C++98中的指针空值 良好的C/C++编程习惯中,声明一个变量时最好给该变量-个合适的初始值,否则可能会出现不可预料的错误,比如末初始化指针...如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化: void Testptr() { int* p1 = NULL; int* p2 = 0; } NULL实际是一个宏, 传统的...不论采取何种定义,使用空值的指针时,都不可避免的会遇到一些麻烦,比如: void f(int) { cout<<"f(int)"<<end1; } void f(int*) { cout<<"f(

45720

c语言指针的基本使用

指针变量的定义和初始化 2. 指针操作 3. 按引用向函数传递参数 4. const 修饰符 5. sizeof 操作符 6. 指针表达式和指针运算 7. 指针数组 8....指针变量的定义和初始化 与C语言其他变量类似,指针也是一种变量,只不过它与其他变量不同,一般变量是直接包含了一个特定的值,而指针是包含了一个变量的值所在的地址,也就是说,指针存储了一个变量的地址,间接地指向一个值...与一般的变量一样,指针使用之前也必须定义: int *countPtr; 以上语句定义了一个 int * 类型的变量countPtr,表示countPtr是一个指向int类型变量值的指针。...,不会报错,但第二个count是int类型的变量,可能会导致逻辑错误,必须注意 一个指针必须在定义时或者赋值语句初始化,可以初始化成0,NULL或者一个变量的地址。...这是为什么呢?

87310

【C++初阶】--- C++入门(中)

缺省值必须是常量或者全局变量; C语言不支持(编译器不支持); 上述第二点,为什么只能在函数声明时给缺省值? 因为缺省参数是调用的阶段使用的。...'c'); cout -> f(int a, char b) //f('c', 10); cout -> f(char a, int b) 2.2 C++支持函数重载的原理 — 名字修饰 问:为什么...采用C++编译器编译结果 结论:linux下,采用g++编译完成,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改的名字中。...引用不能完全替代指针原因:引用定义不能改变指向!...引用和指针的不同点: 引用概念上定义一个变量的别名,指针存储一个变量地址; 引用在定义时必须初始化指针没有要求; 引用在初始化时引用一个实体,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体

10110

范围for语句的整理

中文版5th中P116的练习题目) 由于编译器初始化时会将这些数组形式的元素转换成指向该数组内首元素的指针,这样得到的row类型就是int*,这样原来的for语句就是一个int*中遍历,这是不合法的。...4; col++) cout << ia[row][col] << endl; cout << endl; //使用普通for语句,使用指针 int(*...; return 0; } 4.为什么不能通过范围dor语句向vector(或者其他容器)中添加元素 范围for语句的语法形式为 for(declaration:expression)...statement 其中expression必须为一个序列,为什么呢?...因为这个时候对容器的增删操作使得保存在end中的迭代器失效了,不再指向任何元素,或者是尾元素的一个位置。 5.为什么需要对序列中的元素执行写操作的时候,循环变量必须声明成引用类型?

77820

由浅入深学习单例模式

一些编译器中static 局部变量并不是线程安全的?有两种方案,加锁和利用类内static对象main函数之前初始化来保证线程安全。...其他一些基本知识点: static局部静态变量,是程序执行到语句的时候才进行初始化,且只初始化一次。 类内的static变量,初始化是在外部进行的。且main函数之前进行初始化。...下面依次来介绍: 饿汉模式 饿汉模式是指,无论是否使用,程序启动,就会把单例实例化出来。...懒汉模式 懒汉模式,是指在使用到时,才去初始化,没有用到就不处理。有两种方法。指针版和局部static变量版。 下面先看一下指针版的懒汉模式。...这种方法,获取单例都要加一句释放语句,写代码中很容易遗忘,且看起来不是那么优雅。怎么避免这个主动释放呢?

39670

【C++修行之道】引用、内联函数、auto关键字、for循环(C++)、nullptr(C++11)

为什么?...引用在定义时必须初始化指针没有要求 引用在初始化时引用一个实体,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 没有NULL引用,但有NULL指针 sizeof中含义不同:引用结果为引用类型的大小...3.2 auto简介 早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的 是一直没有人去使用它,大家可思考下为什么?...,否则可能会出现 不可预料的错误,比如未初始化指针。...不论采取何 种定义,使用空值的指针时,都不可避免的会遇到一些麻烦,比如: void f(int i) { cout << "f(int)" << endl; } void f(int* p) {

2800

C++入门知识(二)

该条语句编译时会出错,定义时没有初始化 int& ra = a; int& rra = a; printf("%p %p %p\n", &a, &ra, &rra); } 3.常引用 常引用声明方式...引用使用时无需解引用(*),指针需要解引用; 3. 引用只能在定义时被初始化一次,之后不可变;指针可变; 4. 引用没有 const,指针有 const; 5....f@@YAXH@Z),该符号函数 _main 中被引用 8auto关键字 auto是一个C/C++语言存储类型,仅在语句块内部使用,初始化可为任何表达式,其特点是当执行流程进入该语句块的时候初始化可为任何表达式...10指针空值nullptr nullptr:是C++空指针类型的关键字,nullptr是C++11中引入的。...C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

50710

再探虚函数

以下这种方式的重载是错误的,这要跟C++的编译的函数名扯上关系了。...2、纯虚函数是基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。基类中实现纯虚函数的方法是函数原型加"=0" 3、声明了纯虚函数的类是一个抽象类。...vptr是一个指针类的构造函数中创建生成,并且只能用this指针来访问它,因为它是类的一个成员,并且vptr指向保存虚函数地址的vtable.对于静态成员函数,它没有this指针,所以无法访问vptr...---- Q8:基类的虚函数表存放在内存的什么区,虚表指针vptr的初始化时间?...多态的函数调用语句被编译成根据基类指针所指向的(或基类引用所引用的)对象中存放的虚函数表的地址,虚函数表中查找虚函数地址,并调用虚函数的一系列指令。

85120
领券