c++中函数的内存注意项

函数不能返回指向栈内存的指针!因为返回的都是值拷贝!

char *str = "abcd"这样就是字符串常量,这种能返回,而char str[] = "abcd"就不能在函数中返回了,因为这个是局部变量,函数结束后就内存释放了

如果非要进行返回局部变量,就只能用static来限制局部变量了,这样函数结束后就不会释放这个变量的内存了。

或者在被调用函数中用new命令申请空间,然后在调用完毕返回后用delete释放空间,不过这样做的坏处是接口不友好。

  下面是四种情况分析

1.正确。最normal的情况。

int returnValue();

int _tmain(int argc, _TCHAR* argv[])

{

std::cout<<returnValue();

return 0;

}

char returnValue()

{

int value=3;

return value;

}

2.错误。最normal错误。虽然value被释放,但是它的值不一定会被清除,所以有时候你这么用看起来结果好像也是对的,但是隐患无穷。

[cpp]

int* returnValue();

int _tmain(int argc, _TCHAR* argv[])

{

std::cout<<*(returnValue());

return 0;

}

int* returnValue()

{

int value=3;

return &value;

}

3.正确。不用奇怪,“HelloJacky”是一个字符串常量,储存在只读数据段,return str只是返回了该字符串在只读数据段所在的首地址,当函数退出后,该字符串所在的内存不会被回收,所以是正常的。

[cpp]

char* returnValue();

int _tmain(int argc, _TCHAR* argv[])

{

std::cout<<returnValue();

return 0;

}

char* returnValue()

{

char* str="HelloJacky";

return str;

}

4.错误。这一回“HelloJacky”是栈内的局部变量,函数退出时内存被释放,因此返回栈内局部变量的地址是错误的。

[cpp]

char* returnValue();

int _tmain(int argc, _TCHAR* argv[])

{

std::cout<<returnValue();

return 0;

}

char* returnValue()

{

char str[]="HelloJacky";

return str;

}

时间: 2024-10-06 11:52:11

c++中函数的内存注意项的相关文章

C++中的自定义内存管理

1,问题: 1,new 关键字创建出来的对象位于什么地方? 1,位于堆空间: 2,有没有可能位于其它地方? 1,有: 2,通过一些方式可以使动态创建的对象位于静态存储区: 3,这个存储区在程序结束后释放: 2,new/delete 被忽略的事实: 1,new/delete 的本质是 C++ 预定义的操作符: 1,new/delete 是关键字,但本质是预定义的操作符: 2,C++ 中操作符可以重载: 2,C++ 对这两个操作符做了严格的行为定义: 1,new: 1,获取足够大的内存空间(默认为堆

C++程序中不同变量、函数在内存中内存中的分布情况

一.一个C++编译的程序占用的内存分为以下几个部分 1.栈区:由编译器自动分配 存放函数的参数值,局部变量的值等,操作方式类似于数据结构中的栈. 2.堆区:一般由程序员分配释放,若程序员不释放,程序结束时 可能 有系统收回.它与数据结构中的堆是两回事.分配方式类似于链表. 3.全局区(静态区):全局变量和静态变量是存储放在一块的,初始化的全局变量和静态变量在一个区域,未初始化的在相邻的另一个区域. 程序结束后由系统释放. 4.文字常量区:常量字符串就存放在这里.程序结束后有系统自动释放. 5.程

C程序中常见的内存操作错误

对C/C++程序员来说,管理和使用虚拟存储器可能是个困难的, 容易出错的任务.与存储器有关的错误属于那些令人惊恐的错误, 因为它们在时间和空间上, 经常是在距错误源一段距离之后才表现出来. 将错误的数据写到错误的位置, 你的程序可能在最终失败之前运行了好几个小时,且使程序中止的位置距离错误的位置已经很远啦.而避免这种噩梦的最好方法就是防范于未然. 幸好<深入理解计算机系统>中有一段讲: C程序中常见的内存操作有关的10种典型编程错误,十分经典, 因此抄写在此, 以便以后随时查看,复习. 把优秀

【转】《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误

原文地址:http://blog.csdn.net/slvher/article/details/9150597 对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的模块跑起来后才出现内存崩溃,是很让人痛苦的.因为崩溃的位置在时间和空间上,通常是在距真正的错误源一段距离之后才表现出来.前几天线上模块因堆内存写越界1个字节引起各种诡异崩溃,定位问题过程中的折腾仍历历在目,今天读到<深入理解计算机系统>第9章-虚拟存储器,发现书中总结了C程序中常见的内存操作有

C++ 虚函数的内存分配

1.无继承的普通类: 在有虚函数的情况下类会为其增加一个隐藏的成员,虚函数表指针,指向一个虚函数表,虚函数表里面就是类的各个虚函数的地址了.那么,虚函数表指针是以什么模型加入到类里面的,虚函数表里面又是怎么安排的呢.简单来看下就可以知道了. #include"stdafx.h" #pragma pack(8) class A{ public: int a; double a2; A() :a(0xaaaaaaaa), a2(0){} virtual void funA2(){} vir

Cocos2d-x v3.11 中的新内存模型

Cocso2d-x v3.11 一项重点改进就是 JSB 新内存模型.这篇文章将专门介绍这项改进所带来的新研发体验和一些技术细节. 1. 成果 在 Cocos2d-x v3.11 之前的版本中,使用 JS 语言发布原生版本的用户可能多少都会遇到一个经典的问题:Invalid Native Object,或者遇到一些莫名其妙的 JS 对象失效的崩溃.而解决这些问题,我们给出的解决方案基本是使用 retain / release 来显式声明持有或释放对象,或者是在脚本层更合理得持有对象索引.而在 v

JAVA中堆栈和内存分配

(一).栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中.)3. 堆:存放所有new出来的对象.4. 静态域(属于方法区) :存放静态成员(static定义的)5. 常量池 (属于方法区):存放字符串常量和基本类型常量(public static final).6. 非RAM存储:硬盘等永久存储空间这里我们主要关心栈

java中的堆内存和栈内存

Java把内存分成两种: 一种叫做栈内存 一种叫做堆内存 栈内存 : 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用. 堆内存 : 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.在数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着

js中函数参数值传递和引用传递

js中函数参数值传递和引用传递:在阅读本章节之前建议参阅一下两章节:1.值类型可以参阅javascript的值类型一章节.2.引用类型可以参阅javascript的引用类型一章节.一.函数传递值类型:代码实例如下: function addNum(num) { num+=10; return num; } var num=10; var result=addNum(num); console.log(num); console.log(result); 以上代码的弹出值分别为:10和20,下面进