永发信息网

c++不用malloc,new等如何申请内存?

答案:2  悬赏:10  手机版
解决时间 2021-03-20 13:05
以前看过一篇有关内存管理(分配)机制的文章(很短),后来找不到了。大致意思是可以返回数据段未使用内存的起始地址和结束地址(堆),想知道有没有可以返回这两个地址的函数,这样中间位置的内存我可以自由使用,说的可能不正确,请解答?如果用汇编获得数据段及附加段的地址,初始化用去的内存如何计算?理解错误请指正,谢谢!
最佳答案
如今的计算机都用虚拟存储。数据量大于存储区容量也可以。存储区多程序共享。程序里的地址,也并非真地址。
如果你想节省内存,按需要 随时申请 增加 或 减少 内存占有数,可以用 realloc。

下面是程序例子:输入 暂时不知道个数的 整数,把它们存入动态分配的数组,直到输入数-999时结束,打印出输入数。

#include<iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
main(){
int v,n=0,i;
int *a=NULL;
int *more_a = NULL;

printf ("Enter integer values (-999 to end):\n ");
do {
scanf ("%d", &v);
n++;
more_a = (int *) realloc (a, n * sizeof(int));
if (more_a !=NULL) {
a=more_a;
a[n-1]=v;
}
else {
free (a);
printf ("Error allocating memory");
exit (1);
}
} while (v!= -999);
n=n-1;
printf ("Numbers entered: ");
for (i=0; i<n;i++) printf ("%d ",a[i]);
free (a);
return 0;
}
全部回答
从编程纪律、规则上说,是不可以。 因为 new 和delete 操作时, 是把对象当成一个复杂类,而执行对应的构造/析构函数。  而 malloc 和 free 则不执行它们。 题目中所说的两种错配情况, 会导致不可预测的错误发生。而这种错误,在项目很大时是比较难发现的。相当于项目中埋藏的炸弹。 但是当对象是简单类型时,确实是不会出错。比如 int *i=new int[100]; free(i);原因是 int,float 这种数字类型过于简单,没有复杂的构造/析构函数,因此此时 new 和 malloc是等价的。 但是比如在复杂类型a中: class a { void * t; public a(){ t=malloc(100); } public ~a() { free(t); } }; void main() { a *m=new a(); a *n=(a *)malloc(sizeof(a));//导致n的构造 没运行 free(m);        //导致m的析构没运行. delete n;         }错配会导致严重的问题,比如内存泄漏等。 因此工作中不提倡这种错配写法,尽管有时可能不会导致程序出错,但是这是一种很坏的习惯。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
鑫顺发超市地址有知道的么?有点事想过去
哈尔滨一年那几个月冷那几个月暖
李宗盛前妻朱卫茵婚姻状况
如何实现优质就业
x+y=13 y-x=6 求 x,y 数值
为什么小孩打了卡介苗以后会有脓点?
小米手机在湖南新化哪里有的卖的?。
请问深大和广东工业大学的物联网工程哪个好
宜博k727和魔腾kb822那个好?
魔兽世界gathermate有什么用?
建筑工程有个税率是0.0341的,2018年5月1日税
玩到第五关不知道该怎么继续了
赵一涵的身高和体重
6666.66平方米的周围怎么计算
可视对讲室内机为什么叫
推荐资讯
如图,一种滑伞的开状是左右对称的四边形ABCD
食尚嘉地址有知道的么?有点事想过去
飞利浦e103耳机内放音质怎么样 手机好吗
判断题“东非人”不仅能使用工具,还能制造复
表示很可怕的四字词语
戊戌变法和辛亥革命的相同点是:①爱国的,进
家住五楼,主卧窗户下面是停车场入口,会影响风
桥架垂直下弯通怎么做
winktv这个女主播是谁?
如果明年真的提高养老金,可能会提高多少
我在工地是干木匠的,在干活的过程不小心把脚
梦到有个男的亲我嘴,我感觉的到,但是睁不开眼
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?