易截截图软件、单文件、免安装、纯绿色、仅160KB

C/C++返回内部静态成员的陷阱

 C/C++返回内部静态成员的陷阱
陈皓
背景
在我们用
C/C++开发的过程中,总是有一个问题会给我们带来苦恼。这个问题就是函数内和函数外代码需要通过一块内存来交互(比如,函数返回字符串),这个问题困
扰和很多开发人员。如果你的内存是在函数内栈上分配的,那么这个内存会随着函数的返回而被弹栈释放,所以,你一定要返回一块函数外部还有效的内存。
这是一个让无数人困扰的问题。如果你一不小心,你就很有可能在这个上面犯错误。当然目前有很多解决方法,如果你熟悉一些标准库的话,你可以看到许多各式各样的解决方法。大体来说有下面几种:
1)
在函数内部通过malloc或new在堆上分配内存,然后把这块内存返回(因为在堆上分配的内存是全局可见的)。这样带来的问题就是潜在的内存问题。因
为,如果返回出去的内存不释放,那么就是memory
Leak。或者是被多次释放,从而造成程序的crash。这两个问题都相当的严重,所以这种设计方法并不推荐。(在一些Windows
API中,当你调用了一些API后,你必需也要调用他的某些API来释放这块内存)
2)让用户传入一块他自己的内存地址,而在函数中把要
返回的内存放到这块内存中。这是一个目前普遍使用的方式。很多Windows
API函数或是标准C函数都需要你传入一个buffer和这个buffer的长度。这种方式对我们来说应该是屡见不鲜了。这种方式的好处就是由函数外部的
程序来维护这块内存,比较简显直观。但问题就是在使用上稍许有些麻烦。不过这种方式把犯错误的机率减到了最低。
3)第三种方式显得比较另
类,他利用了static的特性,static的栈内存一旦分配,那这块内存不会随着函数的返回而释放,而且,它是全局可见的(只要你有这块内存的地
址)。所以,有一些函数使用了static的这个特性,即不用使用堆上的内存,也不需要用户传入一个buffer和其长度。从而,使用得自己的函数长得很
漂亮,也很容易使用。
这里,我想对第三个方法进行一些讨论。使用static内存这个方法看似不错,但是它有让你想象不到的陷阱。让我们来用一个实际发生的案例来举一个例子吧。
示例
有过socket编程经验的人一定知道一个函数叫:inet_ntoa,这个函数主要的功能是把一个数字型的IP地址转成字符串,这个函数的定义是这样的(注意它的返回值):
char *inet_ntoa(struct in_addr in);
显然,这个函数不会分配堆上的内存,而他又没有让你传一下字符串的buffer进入,那
么他一定使用“返回static
char[


相关文档:

oracle中pro*c的学习


oracle中pro*c的学习
 一 Pro*C 程序概述:
1.什么是Pro*C程序
在ORACLE数据库管理和系统中, 有三种访问数据库的方法;
(1) 用SQL*Plus, 它有SQL命令以交互的应用程序访问数据库;
(2) 用第四代语言应用开发工具开发的应用程序访问数据库,这些工具有SQL*froms,QL*Reportwriter,SQL*Menu等;
(3) 利用在 ......

Linux c++






Linux/UNIX C++高级培训---远程班
http://www.xuanyuan-soft.cn/index.php?option=com_content&view=article&id=84&Itemid=85
课程概要
 
培养目标
:Linux/UNIX C++软件工程师
专注Linux/UNIX服务器端的软件开发(后台开发),培养企业所需的专业Linux/UNIX C ......

C' Fragment

把输入的一串字符转成数组,转成链表,然后删去其中指定的字符,在尾部添加一个字符。
(程序还不完善,没有对输错的情况进行处理,,暂时先这样吧。。= =。)
#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct link)
struct link
{
char ch;
struct link *next;
}*string;
char a ......

C/C++头文件一览


C/C++
头文件一览

//////////////////////////////////////////////////////////////////////////
C
头文件
(C89,C95)
(C++98,C++03也包含)
include <assert.h>    //诊断库
include <ctype.h>     //字符处理函数库
include <errno.h>     //错误定义
include <float.h& ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号