c++不用malloc,new等如何申请内存?
答案:2 悬赏:10 手机版
解决时间 2021-03-20 13:05
- 提问者网友:不爱我么
- 2021-03-19 22:16
以前看过一篇有关内存管理(分配)机制的文章(很短),后来找不到了。大致意思是可以返回数据段未使用内存的起始地址和结束地址(堆),想知道有没有可以返回这两个地址的函数,这样中间位置的内存我可以自由使用,说的可能不正确,请解答?如果用汇编获得数据段及附加段的地址,初始化用去的内存如何计算?理解错误请指正,谢谢!
最佳答案
- 五星知识达人网友:煞尾
- 2019-10-25 06:31
如今的计算机都用虚拟存储。数据量大于存储区容量也可以。存储区多程序共享。程序里的地址,也并非真地址。
如果你想节省内存,按需要 随时申请 增加 或 减少 内存占有数,可以用 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;
}
如果你想节省内存,按需要 随时申请 增加 或 减少 内存占有数,可以用 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;
}
全部回答
- 1楼网友:雾月
- 2020-04-10 18:12
从编程纪律、规则上说,是不可以。
因为 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;
}错配会导致严重的问题,比如内存泄漏等。
因此工作中不提倡这种错配写法,尽管有时可能不会导致程序出错,但是这是一种很坏的习惯。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯