C++动态c 分配内存存

> 问题详情
关于动态存储分配,下列说法正确的是A.new 和 delete是C++语言中专门用于动态内存分配和释放的函
悬赏:0&答案豆
提问人:匿名网友
发布时间:
关于动态存储分配,下列说法正确的是A.new 和 delete是C++语言中专门用于动态内存分配和释放的函数B.动态分配的内存空间也可以被初始化C.当系统内存不够时,会自动回收不再使用的内存单元,因些程序中不必用delete释放内存空间D.当动态分配内存失败时,系统会立刻崩溃,因此一定要慎用new
网友回答(共0条)
我有更好的答案
您可能感兴趣的试题
1有以下程序    #include<iostream>    using namespace std;    class MyClass    {    public:       MyClass(intn) {number=n;}      //拷贝构造函数      MyClass (MyClass& other) {number=other.number;}      ~MyClass(){}    private:      int number;    };    MyClass fun (MyClass p)    {      MyClass temp(p);      return temp;    }    intmain()    {      MyClass obj1(10),obj2(0);      MyClass obj3(obj1);      obj2=fun(obj3);    return0;    }    程序执行时,MyClass类的拷贝构造函数被调用的次数是A.5B.4C.3D.22在公有派生的情况下,派生类中定义的成员函数只能访问原基类的A.公有成员和私有成员B.私有成员和保护成员C.公有成员和保护成员D.私有成员、保护成员和公有成员
相关考试课程
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID28641空间积分0 积分795阅读权限20帖子精华可用积分795 信誉积分136 专家积分0 在线时间69 小时注册时间最后登录
丰衣足食, 积分 795, 距离下一级还需 205 积分
帖子主题精华可用积分795 信誉积分136 专家积分0 在线时间69 小时注册时间最后登录
论坛徽章:0
以前写二维数据数组的时候都是事先定义好的
char& &a[m][n];
但是现在,m和n的值都是在程序运行期间得知啊,
因此我想用
来代替char a[m][n];
就是在程序运行期间分配a[m][n]的内存,使用p指向头,
怎么写啊?
秦假仙 业途灵,
&img src=\&/cgi-bin/showPhoto?PhotoId=2550&GroupId=3955343&Small=0\&&
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
UID154716空间积分0 积分1080阅读权限30帖子精华可用积分1080 信誉积分126 专家积分0 在线时间288 小时注册时间最后登录
家境小康, 积分 1080, 距离下一级还需 920 积分
帖子主题精华可用积分1080 信誉积分126 专家积分0 在线时间288 小时注册时间最后登录
论坛徽章:0
如何使用动态分配内存char **a 来代替char a[m][n]
这个问题已经说的都懒的再说了,
你找找好了,很多帖子。
悲哉,秋之为气也。
萧瑟夕草木摇落而变衰。
好装B,求甚解.
UID空间积分0 积分17435阅读权限100帖子精华可用积分17435 信誉积分201 专家积分160 在线时间2513 小时注册时间最后登录
帖子主题精华可用积分17435 信誉积分201 专家积分160 在线时间2513 小时注册时间最后登录
论坛徽章:0
如何使用动态分配内存char **a 来代替char a[m][n]
char **p = (char **)malloc(sizeof(char) * m * n);
技术blog: /converse/
好装B,求甚解.
UID空间积分0 积分17435阅读权限100帖子精华可用积分17435 信誉积分201 专家积分160 在线时间2513 小时注册时间最后登录
帖子主题精华可用积分17435 信誉积分201 专家积分160 在线时间2513 小时注册时间最后登录
论坛徽章:0
如何使用动态分配内存char **a 来代替char a[m][n]
吃饭的时候想起来我上面的代码犯了一个错,应该这样:
char *q = (char*)malloc(sizeof(char)*m*n);
char **p =复制代码
技术blog: /converse/
UID空间积分0 积分2184阅读权限100帖子精华可用积分2182 信誉积分100 专家积分28 在线时间9 小时注册时间最后登录
帖子主题精华可用积分2182 信誉积分100 专家积分28 在线时间9 小时注册时间最后登录
论坛徽章:0
如何使用动态分配内存char **a 来代替char a[m][n]
对于 char **p = (char **)malloc(sizeof(char) * m * n);
这样做并不能达到用 p[j] 表示每个元素的目的,因为其中p的指向是不固定的。二维指针的使用远比一维指针的使用复杂,需要仔细处理。
只给出实现的思路,程序自己写吧。
1. 分配一个大小为 m*sizeof(char*) 的内存空间,让 p 指向这个它的首地址。可把此内存空间当作数组来看待,这个数组的元素类型为 char*,可以用 p 这样的形式来表示。
下面又有两种做法,可从中选择其一:
2.1 分配一个大小为 m*n*sizeof(char)的内存空间用来存储真正的数据。假设pt是这块空间的首地址,则根据 p = pt + i * n * sizeof(char) 这个规律计算 p 的值(0&i&m)。
2.2 为每一个 p 单独分配大小为 n * sizeof(char) 的内存空间,并且让 p 指向这块空间的首地址(0&i&m)。
经过这样的处理之后,这时的 p[j] 才是你真正想访问的元素。
把上面的 char 换为其它类型,就可以处理其它类型的数据了。不要忘记最后要释放你分配的所有内存。
好装B,求甚解.
UID空间积分0 积分17435阅读权限100帖子精华可用积分17435 信誉积分201 专家积分160 在线时间2513 小时注册时间最后登录
帖子主题精华可用积分17435 信誉积分201 专家积分160 在线时间2513 小时注册时间最后登录
论坛徽章:0
如何使用动态分配内存char **a 来代替char a[m][n]
whglinux老兄,你发上面的帖子的时候可能没有看到我的回帖,你看看我那样做对吗?
技术blog: /converse/
UID28641空间积分0 积分795阅读权限20帖子精华可用积分795 信誉积分136 专家积分0 在线时间69 小时注册时间最后登录
丰衣足食, 积分 795, 距离下一级还需 205 积分
帖子主题精华可用积分795 信誉积分136 专家积分0 在线时间69 小时注册时间最后登录
论坛徽章:0
如何使用动态分配内存char **a 来代替char a[m][n]
不好意思,发重复了,就将就这个帖子把
char a[m][n];
a=(char **)malloc(m*sizeof(char *));
for (i=0;i&m;i++)
& &&&a[i]=(char *)malloc ((n+1)*sizeof(char)); 复制代码
这样行么?
秦假仙 业途灵,
&img src=\&/cgi-bin/showPhoto?PhotoId=2550&GroupId=3955343&Small=0\&&
好装B,求甚解.
UID空间积分0 积分17435阅读权限100帖子精华可用积分17435 信誉积分201 专家积分160 在线时间2513 小时注册时间最后登录
帖子主题精华可用积分17435 信誉积分201 专家积分160 在线时间2513 小时注册时间最后登录
论坛徽章:0
如何使用动态分配内存char **a 来代替char a[m][n]
我吃饭的时候也想过这样做,不过这样做存在以下的问题:
1)分配的char数组可能不是连续的
2)如果1)成立的话,那么就不能free(a)进行释放,只能再写一个循环来释放内存了
我个人觉得还是我上面给出的第二个办法是正确的,欢迎大家抛砖指教
技术blog: /converse/
好装B,求甚解.
UID空间积分0 积分17435阅读权限100帖子精华可用积分17435 信誉积分201 专家积分160 在线时间2513 小时注册时间最后登录
帖子主题精华可用积分17435 信誉积分201 专家积分160 在线时间2513 小时注册时间最后登录
论坛徽章:0
如何使用动态分配内存char **a 来代替char a[m][n]
又有一个问题,如果上面我的第二种做法是对的话,那么释放内存的时候应该是free(a)还是free(*a)??
我想知道的是free函数内部是怎样找到分配的内存的?
技术blog: /converse/
UID28641空间积分0 积分795阅读权限20帖子精华可用积分795 信誉积分136 专家积分0 在线时间69 小时注册时间最后登录
丰衣足食, 积分 795, 距离下一级还需 205 积分
帖子主题精华可用积分795 信誉积分136 专家积分0 在线时间69 小时注册时间最后登录
论坛徽章:0
如何使用动态分配内存char **a 来代替char a[m][n]
[quote]原帖由 &converse&][/quote 发表:
老大。你这个不行拉,类型都错误了啊!
秦假仙 业途灵,
&img src=\&/cgi-bin/showPhoto?PhotoId=2550&GroupId=3955343&Small=0\&&
创客168第4期:业务导向下的运维管理
创客168第4期沙龙活动聚焦运维话题,邀请优秀互联网企业技术专家分享运维平台建设,运维常用工具实践,成长型企业面临的运维和安全问题,应用性能管理解决方案等运维话题。,聚焦发展中的关键和共性运维技术难点。
----------------------------------------
活动日期:日
活动地点:长林咖啡书屋
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处C++动态内存分配
操作符new 和new[ ]
操作符new的存在是为了要求动态内存。new 后面跟一个数据类型,并跟一对可选的方括号[
]里面为要求的元素数。它返回一个指向内存块开始位置的指针。其形式为:
pointer = new type
pointer = new type [elements]
第一个表达式用来给一个单元素的数据类型分配内存。第二个表达式用来给一个数组分配内存。
bobby = new int [5];
在这个例子里,操作系统分配了可存储5个整型int元素的内存空间,返回指向这块空间开始位置的指针并将它赋给bobby。因此,现在bobby
指向一块可存储5个整型元素的合法的内存空间,如下图所示。
你可能会问我们刚才所作的给指针分配内存空间与定义一个普通的数组有什么不同。最重要的不同是,数组的长度必须是一个常量,这就将它的大小在程序执行之前的设计阶段就被决定了。而采用动态内存分配,数组的长度可以常量或变量,其值可以在程序执行过程中再确定。
动态内存分配通常由操作系统控制,在多任务的环境中,它可以被多个应用(applications)共享,因此内存有可能被用光。如果这种情况发
生,操作系统将不能在遇到操作符new 时分配所需的内存,一个无效指针(null
pointer)将被返回。因此,我们建议在使用new之后总是检查返回的指针是否为空(null),如下例所示:
bobby = new int [5];
if (bobby == NULL) {
// error assigning memory. Take measures.
删除操作符delete
既然动态分配的内存只是在程序运行的某一具体阶段才有用,那么一旦它不再被需要时就应该被释放,以便给后面的内存申请使用。操作符delete
因此而产生,它的形式是:
delete [ ]
第一种表达形式用来删除给单个元素分配的内存,第二种表达形式用来删除多元素(数组)的内存分配。在多数编译器中两种表达式等价,使用没有区别,
虽然它们实际上是两种不同的操作,需要考虑操作符重载
NULL是C++库中定义的一个常量,专门设计用来指代空指针的。如果这个常量没有被预先定义,你可以自己定以它为0:
#define NULL 0
在检查指针的时候,0和NULL并没有区别。但用NULL
来表示空指针更为常用,并且更易懂。原因是指针很少被用来比较大小或被直接赋予一个除0以外的数字常量,使用NULL,这一赋值行为就被符号化了。
#include&&iostream&
#include&&string&
using&namespace&std;
int&main&(
&&&&&&&&char&input&[100];
&&&&&&&&int&i,n;
&&&&&&&&long&*&l;
&&&&&&&&cout&&&&"How many numbers
do you want to type in? ";
&&&&&&&&cin.getline&(input,100);
&&&&&&&&i=atoi(input);
&&&&&&&&l=&new&long[i];
&&&&&&&&if&(l&==&NULL)
&&&&&&&&&&&&&&&&exit&(1);
&&&&&&&&for&(n=0;&n&i;&n++)
&&&&&&&&&&&&&&&&cout&&&&"Enter number:
&&&&&&&&&&&&&&&&cin.getline&(input,100);
&&&&&&&&&&&&&&&&l[n]=atol&(input);
&&&&&&&&cout&&&&"You have
entered: ";
&&&&&&&&for&(n=0;&n&i;&n++)
&&&&&&&&&&&&&&&&cout&&&&l[n]
&&&&&&&&delete[]&l;
&&&&&&&&return&0;
ANSI-C 中的动态内存管理Dynamic memory in
操作符new 和delete
仅在C++中有效,而在C语言中没有。在C语言中,为了动态分配内存,我们必须求助于函数库stdlib.h。因为该函数库在C++中仍然有效,并且在一些现存的程序仍然使用,所以我们下面将学习一些关于这个函数库中的函数用法。
函数malloc
这是给指针动态分配内存的通用函数。它的原型是:
void * malloc (size_t
其中nbytes
是我们想要给指针分配的内存字节数。这个函数返回一个void*类型的指针,因此我们需要用类型转换(type
cast)来把它转换成目标指针所需要的数据类型,例如:
ronny = (char *) malloc (10);
这个例子将一个指向10个字节可用空间的指针赋给ronny。当我们想给一组除char
以外的类型(不是1字节长度的)的数值分配内存的时候,我们需要用元素数乘以每个元素的长度来确定所需内存的大小。幸运的是我们有操作符sizeof,它
可以返回一个具体数据类型的长度。
bobby = (int *) malloc (5 * sizeof(int));
这一小段代码将一个指向可存储5个int型整数的内存块的指针赋给bobby,它的实际长度可能是
2,4或更多字节数,取决于程序是在什么操作系统下被编译的。
函数calloc
calloc 与malloc
在操作上非常相似,他们主要的区别是在原型上:
void * calloc (size_t nelements, size_t
因为它接收2个参数而不是1个。这两个参数相乘被用来计算所需内存块的总长度。通常第一个参数(nelements)是元素的个数,第二个参数
被用来表示每个元素的长度。例如,我们可以像下面这样用calloc定义bobby:
bobby = (int *) calloc (5, sizeof(int));
malloc 和calloc的另一点不同在于calloc
会将所有的元素初始化为0。
函数realloc
它被用来改变已经被分配给一个指针的内存的长度。
void * realloc (void * pointer, size_t
参数pointer 用来传递一个已经被分配内存的指针或一个空指针,而参数size
用来指明新的内存长度。这个函数给指针分配size
字节的内存。这个函数可能需要改变内存块的地址以便能够分配足够的内存来满足新的长度要求。在这种情况下,指针当前所指的内存中的数据内容将会被拷贝到新
的地址中,以保证现存数据不会丢失。函数返回新的指针地址。如果新的内存尺寸不能够被满足,函数将会返回一个空指针,但原来参数中的指针pointer
及其内容保持不变。
这个函数用来释放被前面malloc, calloc
或realloc所分配的内存块。
void free (void *
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。下次自动登录
现在的位置:
& 综合 & 正文
利用libjpeg库压缩成jpg图像,采用动态内存分配
/linux/c/c++
利用ibjpeg库进行图片的压缩,经常调用jpeg_stdio_dest(&cinfo,fp/*文件指针*/)函数。由于fp文件是在调用函数之前就分配好了的足够大的内存来存储压缩后的图像,所以经过压缩后的图像大小(单位为kb)即为fp分配的内存大小。因此就会出现分配fp的内存越大就越会浪费空间;但如果分配fp的内存不够大,就会造成压缩崩溃。
libjpeg图片压缩,只有在压缩结束后才知道具体的内存大小。所以动态的分配内存既不会造成空间浪费,也不会造成压缩崩溃。
libjpeg库中提供了动态分配内存的函数jpeg_mem_dest(j_compress_ptr cinfo, unsigned char** outbuffer, unsigned long* outSize)。所以在压缩的过程中将jpeg_mem_dest()替换掉jpeg_stdio_dest()就可以弥补上述缺点。
//jpeg_mem_dest()函数参数说明:
oubuffer:压缩后的Jpg图像,由函数返回;其内存是在jpeg_mem_dest()函数中申请的,所以压缩完之后需要释放空间,否则造成内存泄露。
outSize:压缩后图像的字节数,由函数返回。
注意:可能不同的libjpeg库此函数名不同,有的为jpeg_memio_dest()。在调用前请查看开源库中jdatadst.c此函数名以及具体的参数。
//函数调用测试:
inRgbImg为输入图像
大小:5.5M
pOutJpgImg为输出图像
//首先分配的内存为
输出实际图像的像素:
大小: 290kb
int quality = 90;
struct jpeg_compress_struct cinfoD
struct jpeg_error_
unsigned char* inImageB
unsigned char*
outbuffer = NULL;
JSAMPROW row_pointer[1];
unsigned long outSize = 0;
inImageBuffer = inRgbImg.bufferP
JSAMPROW row_pointer[1];
unsigned long outSize = 0;
inImageBuffer = inRgbImg.bufferP
cinfoDecodec.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfoDecodec);
jpeg_mem_dest (&cinfoDecodec, &outbuffer, &outSize);
cinfoDecodec.image_width = inRgbImg.
cinfoDecodec.image_height = inRgbImg.
cinfoDecodec.input_components = 3;
cinfoDecodec.in_color_space = JCS_RGB;
jpeg_set_defaults(&cinfoDecodec);
jpeg_set_quality(&cinfoDecodec, quality, true);
jpeg_start_compress(&cinfoDecodec, TRUE);
row_stride = inRgbImg.width * 3;
while (cinfoDecodec.next_scanline & cinfoDecodec.image_height)
row_pointer[0] = & inImageBuffer[cinfoDecodec.next_scanline * row_stride];
(void) jpeg_write_scanlines(&cinfoDecodec, row_pointer, 1);
jpeg_finish_compress(&cinfoDecodec);
for(int i = 0; i & outS i++)
(*pOutJpgImg).bufferPtr[i] = outbuffer[i];
  (*pOutJpgImg).bufferSize = outS
jpeg_destroy_compress(&cinfoDecodec);
if(NULL != outbuffer)
free(outbuffer);
outbuffer = NULL;
在这个过程中主要用到了双指针
char* pOutImage //压缩前图片的字节数
void(char** ptr) {
*ptr = (char *)malloc(Size) ; //Size为压缩后图片的字节数
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 动态内存分配 的文章

 

随机推荐