没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
C++动态内存分配(new/new[]和delete/delete[])详解 为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求。当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变分配内存的大小,calloc:指针指向内存前初始化),这些函数在运行时从堆中(也称自由内存)分配存储单元,但是运用这些库函数需要计算需要开辟内存的大小,容易出现错误。 那么通常我们在C语言中我们开辟内存的方式如下: (void*)malloc(sizeof(void)); 然而,在C+ +中这些函数不能很好地运行。构造
资源推荐
资源详情
资源评论
C++动态内存分配(动态内存分配(new/new[]和和delete/delete[])详解)详解
C++动态内存分配(动态内存分配(new/new[]和和delete/delete[])详解)详解
为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求。当然,C已提供了动态内存分配函数malloc( )和
free( ),以及malloc( )的变种(realloc:改变分配内存的大小,calloc:指针指向内存前初始化),这些函数在运行时从堆中(也称自
由内存)分配存储单元,但是运用这些库函数需要计算需要开辟内存的大小,容易出现错误。
那么通常我们在C语言中我们开辟内存的方式如下:
(void*)malloc(sizeof(void));
然而,在C+ +中这些函数不能很好地运行。构造函数不允许通过向对象传递内存地址来初始化它。如果那么做了,我们可能
忘记了。则对象初始化在C + +中难以保证。
期望某事发生,但结果是在给对象初始化之前意外地对对象作了某种改变。
把错误规模的对象传递给了它。
当然,即使我们把每件事都做得很正确,修改我们的程序的人也容易犯同样的错误。不正确的初始化是编程出错的主要原因,
所以在堆上创建对象时,确保构造函数调用是特别重要的。
C+ +是如何保证正确的初始化和清理并允许我们在堆上动态创建对象的呢?
答案是使动态对象创建成为语言的核心。malloc( )和free( )是库函数,因此不在编译器控制范围之内。如果我们有一个能完
成动态内存分配及初始化工作的运算符和另一个能完成清理及释放内存工作的运算符,编译器就可以保证所有对象的构造函数
和析构函数都会被调用。
若使用原始的动态内存开辟方式就会显得很繁琐,具体代码如下:
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
class Obj
{
int i,j,k;
enum {sz=100};
char buf[sz];
public:
void initialize()
{
cout<<"initialize"<<endl;
i=k=j=0;
memset(buf,0,sz);
}
void destroy() const
{
cout<<"destroying Obj"<<endl;
}
};
int main()
{
Obj* obj=(Obj*)malloc(sizeof(Obj));
if(obj!=0)
obj->initialize();
obj->destroy();
free(obj);
return 0;
}
在上面这行代码中,我们可以看到使用malloc( )为对象分配内存:obj* Obj = (obj*)malloc(sizeof(obj)) ;
这里用户必须决定对象的长度(这也是程序出错原因之一)。因为它是一块内存而不是一个对象,所以malloc( )返回一个
void*.C++不允许将一个void* 赋予任何指针,所以必须映射。因为malloc( )可能找不到可分配的内存(在这种情况下它返回
0),所以必须检查返回的指针以确信内存分配成功。
但最坏的是:Obj->initialize( ) ;用户在使用对象之前必须记住对它初始化。注意构造函数没有被使用,因为构造函数不能被显
式地调用—而是当对象创建时由编译器调用。这里的问题是现在用户可能在使用对象时忘记执行初始化,因此这也是引入程序
缺陷的主要来源。许多程序设计者发现 C的动态内存分配函数太复杂,令人混淆。所以, C程序设计者常常在静态内存区域使
用虚拟内存机制分配很大的变量数组以避免使用动态内存分配。因为C++能让一般的程序员安全使用库函数而不费力,所以应
当避免使用 C的动态内存方法。C++中的解决方案是把创建一个对象所需的所有动作都结合在一个称为new的运算符里。当用
new(new的表达式)创建一个对象时,它就在堆里为对象分配内存并为这块内存调用构造函数。
资源评论
weixin_38747144
- 粉丝: 4
- 资源: 938
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功