C++的内存模型……

jiandingzhe 2011-04-01 07:45:33
我是从Perl转到C,再转到C++的。目前已经理解了C里面内存分配的逻辑,可以写出几千行的不泄漏的小程序。
那么:
是不是C++的内存机制本质上和C是一样的?
C++里面,new除了会按照构造器初始化成员之外,和malloc有什么区别?
应当什么时候用引用?或者像C那样全都用指针也无妨?
...全文
90 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
quwei197874 2011-04-01
  • 打赏
  • 举报
回复
楼主看了<c++对象模型>就都明白了.
飞天御剑流 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jiandingzhe 的回复:]
引用 2 楼 supermegaboy 的回复:

虽然c没有明确提出内存模型的概念,但与c++的内存模型在本质上基本一样,都是bit构成byte,bit或者byte构成对象,可寻址的对象由byte构成。

new与malloc还有一个比较大的区别,一个是运算符,一个是函数。

一般情况下,使用引用提高效率

考虑这个情况:

C/C++ code

SomeClass&a……
[/Quote]

你这个不叫内存模型,你想问的其实是堆对象的管理机制,内存模型是比其更低层的抽象。

instance是SomeClass的一个实例,你的代码发生了内存泄漏,堆对象的指针丢失了。
jiandingzhe 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pathuang68 的回复:]

楼主总结得差不多。
C++中的new/delete对应C中的malloc/free。

至于指针和引用,请参考下面这段文章。
指针和引用的声明方式:
声明指针: char* pc;
声明引用: char c = 'A'
char& rc = c;

它们的区别:
①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑……
[/Quote]
引用的概念我了解,大致上指针相当于unix文件系统的软链接,而引用大致相当于硬链接。对吧?
jiandingzhe 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 supermegaboy 的回复:]

虽然c没有明确提出内存模型的概念,但与c++的内存模型在本质上基本一样,都是bit构成byte,bit或者byte构成对象,可寻址的对象由byte构成。

new与malloc还有一个比较大的区别,一个是运算符,一个是函数。

一般情况下,使用引用提高效率
[/Quote]
考虑这个情况:

SomeClass& sub1() {
SomeClass* result_pt = new SomeClass();
return *result_pt;
}

void sub2() {
SomeClass instance = sub1();
}

当我调用这行的时候,发生了什么?
这里的instance算什么?
当sub2退出时,我产生了内存泄漏吗?
飞天御剑流 2011-04-01
  • 打赏
  • 举报
回复
虽然c没有明确提出内存模型的概念,但与c++的内存模型在本质上基本一样,都是bit构成byte,bit或者byte构成对象,可寻址的对象由byte构成。

new与malloc还有一个比较大的区别,一个是运算符,一个是函数。

一般情况下,使用引用提高效率
pathuang68 2011-04-01
  • 打赏
  • 举报
回复
楼主总结得差不多。
C++中的new/delete对应C中的malloc/free。

至于指针和引用,请参考下面这段文章。
指针和引用的声明方式:
声明指针: char* pc;
声明引用: char c = 'A'
char& rc = c;

它们的区别:
①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。
② 从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对象。引用不能指向空值。
③ 从编译上看,程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。这是使用指针不安全而使用引用安全的主要原因。从某种意义上来说引用可以被认为是不能改变的指针。
④不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。
⑤理论上,对于指针的级数没有限制,但是引用只能是一级。如下:
int** p1; // 合法。指向指针的指针
int*& p2; // 合法。指向指针的引用
int&* p3; // 非法。指向引用的指针是非法的
int&& p4; // 非法。指向引用的引用是非法的
注意上述读法是从左到右。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧