- 浏览: 3020442 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
刚考完大软,心里还在郁闷,随便发点牢骚吧……
昨天同学考C++的时候还有一题,是找出程序错误的题。代码大概是这样:
你看出问题在什么地方了么?
============================================================================
其实应该挺明显的,但昨天被同学问到的时候我却没能一眼看出来。郁闷啊。
foo()的参数是将B复制传递过去的。于是foo()里的参数b在离开foo()的作用域时会被析构,里面的成员p指向的A实例就一起被析构了。然后在main()里的b在离开main()时析构就会尝试再次delete掉同一个A的实例,引发错误。
So what am I trying to say? 这普通的C++毫无疑问是有确定性析构的——局部变量在离开其作用域时就会被析构;显式使用delete时也可以完成析构。正是因为这样,无意中造成的浅拷贝会让引起一些意想不到的问题,就像上面的代码那样。
为了应对这些问题,我们才有了烦琐的idioms,例如:
1、delete之前先检查指针是否为null;(然而不小心用错delete与delete[]运算符的话还是很糟糕)
2、尽量不对复合类型对象直接使用值传递给参数——可以用引用传递,也可以传指针,以减少复制(但如果不想让参数的值被改变怎么办呢?我们有const修饰符,也有拷贝构造函数和operator =的重载……自己实现深拷贝吧)
3、为了避免内存泄漏,我们可以采用RAII……呃
……
具有RAII的可能性是好是坏我觉得还可以一议,像C#或者Java就没办法用RAII,有些人也会说很不爽什么的。但是内存管理到底是应该留给程序员做还是应该让运行时解决掉,这毫无疑问是取决于程序所在的层次:高层的应用应该尽量避免涉及这些细节,一方面不容易出错,另一方面也减轻了程序员的负担。不然我们就得记下一堆idioms,多到能出一整系列的几本书来描述的量,才能写出正确的程序了……
以上纯属吐槽 =v=
C++是门好语言(嗯
昨天同学考C++的时候还有一题,是找出程序错误的题。代码大概是这样:
class A { int i; }; class B { A* p; public: B() { p = new A; } ~B() { delete p; } }; void foo(B b) { // ... } int main() { B b; foo(b); }
你看出问题在什么地方了么?
============================================================================
其实应该挺明显的,但昨天被同学问到的时候我却没能一眼看出来。郁闷啊。
foo()的参数是将B复制传递过去的。于是foo()里的参数b在离开foo()的作用域时会被析构,里面的成员p指向的A实例就一起被析构了。然后在main()里的b在离开main()时析构就会尝试再次delete掉同一个A的实例,引发错误。
So what am I trying to say? 这普通的C++毫无疑问是有确定性析构的——局部变量在离开其作用域时就会被析构;显式使用delete时也可以完成析构。正是因为这样,无意中造成的浅拷贝会让引起一些意想不到的问题,就像上面的代码那样。
为了应对这些问题,我们才有了烦琐的idioms,例如:
1、delete之前先检查指针是否为null;(然而不小心用错delete与delete[]运算符的话还是很糟糕)
2、尽量不对复合类型对象直接使用值传递给参数——可以用引用传递,也可以传指针,以减少复制(但如果不想让参数的值被改变怎么办呢?我们有const修饰符,也有拷贝构造函数和operator =的重载……自己实现深拷贝吧)
3、为了避免内存泄漏,我们可以采用RAII……呃
……
具有RAII的可能性是好是坏我觉得还可以一议,像C#或者Java就没办法用RAII,有些人也会说很不爽什么的。但是内存管理到底是应该留给程序员做还是应该让运行时解决掉,这毫无疑问是取决于程序所在的层次:高层的应用应该尽量避免涉及这些细节,一方面不容易出错,另一方面也减轻了程序员的负担。不然我们就得记下一堆idioms,多到能出一整系列的几本书来描述的量,才能写出正确的程序了……
以上纯属吐槽 =v=
C++是门好语言(嗯
评论
6 楼
RednaxelaFX
2008-05-19
顺带一提……这几天连续的都是考试,我从上个星期三到昨天没有一天是没有考试的;今天一直到后天还继续。所以上网时间没保证撒……T T
5 楼
RednaxelaFX
2008-05-19
C++里,一个类的对象实例默认是可以被复制的,复制会在:
(1)以复制来初始化时:
(2)以复制来赋值时:
默认提供的复制机制是将源对象里的每个成员都原封不动的复制到目标对象中;形象点说就是把源对象的每一bit都直接搬到目标对象上。这种复制方式也被称为浅拷贝(shallow copy)。
但我们不总是想允许这种浅拷贝,因为会带来潜在的安全问题(见上面)。当需要提供与默认复制机制不一样的行为时,我们可以
对(1):提供拷贝构造函数;
对(2):提供operator =的重载。
另外,当我们希望禁止对象的复制时,可以提供私有的拷贝构造函数和operator =的重载。
可以参考The C++ Programming Language, 3rd Edition的10.2.5 Copying Class Objects [class.default.copy]和10.4.4.1 Copying Objects [class.copy]。
我在几天前发的一篇日记里写的那个Set的例子里也有拷贝构造函数和operator =重载的例子,对这个概念不熟悉的话可以看看。
不过明大肯定对这种概念比我熟悉多了,再怎么说平时写的C++代码都比我多多了,我懒啊不想用C++……
(1)以复制来初始化时:
SomeClass c = someInstance; // initialization by copy
(2)以复制来赋值时:
someInstance = someOtherInstance; // copy by assignment
默认提供的复制机制是将源对象里的每个成员都原封不动的复制到目标对象中;形象点说就是把源对象的每一bit都直接搬到目标对象上。这种复制方式也被称为浅拷贝(shallow copy)。
但我们不总是想允许这种浅拷贝,因为会带来潜在的安全问题(见上面)。当需要提供与默认复制机制不一样的行为时,我们可以
对(1):提供拷贝构造函数;
对(2):提供operator =的重载。
class SomeClass { // ... SomeClass( const SomeClass& ); // copy constructor operator =( const SomeClass& ); // copy assignment };
另外,当我们希望禁止对象的复制时,可以提供私有的拷贝构造函数和operator =的重载。
可以参考The C++ Programming Language, 3rd Edition的10.2.5 Copying Class Objects [class.default.copy]和10.4.4.1 Copying Objects [class.copy]。
我在几天前发的一篇日记里写的那个Set的例子里也有拷贝构造函数和operator =重载的例子,对这个概念不熟悉的话可以看看。
不过明大肯定对这种概念比我熟悉多了,再怎么说平时写的C++代码都比我多多了,我懒啊不想用C++……
4 楼
Lighting
2008-05-17
= =!
貌似是叫拷贝构造函数吧~~~
PS:FX大长期不在啊……
貌似是叫拷贝构造函数吧~~~
PS:FX大长期不在啊……
3 楼
Lighting
2008-05-16
啊……晕了……手残了!~!打少了关键的字了……
这样在foo调用结构后析构的b跟main里面的b是同的对象了……
应该是
这样在foo调用结构后析构的b跟main里面的b是不同的对象了……
(为啥没得编辑功能…… =_,= )
这样在foo调用结构后析构的b跟main里面的b是同的对象了……
应该是
这样在foo调用结构后析构的b跟main里面的b是不同的对象了……
(为啥没得编辑功能…… =_,= )
2 楼
Lighting
2008-05-16
哦呀……像lwwin说的那样按引用传递的话的确是没问题~~~
看到这帖,刚开始我也很郁闷~~把b对象以参数形式传进去不会导致B的构造调用么,反汇编看结果才发现,原来只是进行简单的赋值操作而已……然后再写个B的构造
B(const B &obj)
{
p=new A;
}
有这个构造的话在进行
B b;
foo(b)的时候,进入foo作用域后就会执行B(const B &obj)构造了~~~这样在foo调用结构后析构的b跟main里面的b是同的对象了……
其实我也觉得很奇怪,为啥有B(const B &obj)在的时候才会进行构造,没它在的话只是进行简单的赋值……
等FX大的解释!!!
看到这帖,刚开始我也很郁闷~~把b对象以参数形式传进去不会导致B的构造调用么,反汇编看结果才发现,原来只是进行简单的赋值操作而已……然后再写个B的构造
B(const B &obj)
{
p=new A;
}
有这个构造的话在进行
B b;
foo(b)的时候,进入foo作用域后就会执行B(const B &obj)构造了~~~这样在foo调用结构后析构的b跟main里面的b是同的对象了……
其实我也觉得很奇怪,为啥有B(const B &obj)在的时候才会进行构造,没它在的话只是进行简单的赋值……
等FX大的解释!!!
1 楼
lwwin
2008-05-16
void foo(B& b) {...} ???
发表评论
-
字符串的一般封装方式的内存布局 (0): 拿在手上的是什么
2013-11-04 18:22 21386(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
struct做参数不能从寄存器传?
2013-08-28 23:33 0test test test struct Foo { i ... -
[入门级] 使用inline函数的陷阱
2011-04-21 22:39 0xxx.hpp xxx.inline.hpp inline ... -
C++的vtable的name mangling
2011-04-21 21:53 0_ZTV 开头 -
C++里用typedef struct...
2010-06-12 14:42 3847今天要写个东西,参照的一段C++代码里看到了诡异的东西,形式类 ... -
C++的虚方法调用的开销
2010-01-10 02:53 0不只是从vftbl找到函数指针那么简单而已。因为C++支持多继 ... -
C++求值顺序
2009-12-12 23:16 0呵呵,有个例子总是形 ... -
__fastcall由callee做栈平衡
2009-10-14 01:51 0#include <iostream> usin ... -
typedef...
2009-06-16 21:22 0原来函数指针能这样用的啊……原来typedef不只可以用来声明 ... -
拿vtable来玩玩
2009-06-04 03:53 0#include <iostream> usin ... -
从1加到N……我败了
2009-05-11 10:06 0有人提到Python比C++优越因为代码短而简洁,并举例说1加 ... -
delete NULL会怎样?
2009-04-22 10:03 8059原文在此:Can you delete a NULL poin ... -
Boost 1.35.0
2008-06-25 04:45 0Boost C++ Library Version 1.35. ... -
typename关键字的使用
2008-05-15 11:31 2866忘了……模板啊忘光了 T T 今天有同学考C++,后来问了我 ... -
又是宏……do..while(0)的用法
2008-05-04 20:24 4637真是的,我用C++还是太少了。这个宏以前明明见过的,但其存在的 ... -
火星了,今天才知道C++0x也通过了lambda表达式/闭包的提案
2008-04-16 19:31 3025如题。我总是后知后觉诶。不过这提案有意思…… 之前我在C#与 ... -
将ANTLR生成的.tokens文件重格式化(C++版)
2008-03-28 02:02 2408相关链接: 将ANTLR生成的.tokens文件重格式化(Ru ... -
奇怪的宏
2007-11-05 22:19 2076我C++确实不怎么样,不过近来不得不再唤醒那远古的记忆……即使 ...
相关推荐
彻底理解指针,指针数组和数组指针,指针函数和函数指针.doc
鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载Yangcong WolfYangcong WolfYangcong WolfYangcong WolfYangcong WolfYangcong ...
c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针...
C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针
指针 指针教程 指针练习指针 指针教程 指针练习
就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针。 先看下面的代码,注意看代码中的注解: #include #include using namespace...
在一个类中,如果类没有指针成员,一切方便,因为默认合成的析构函数会自动处理所有的内存。但是如果一个类带了指针成员,那么需要我们自己来写一个析构函数来管理内存。在<<c>> 中写到,如果一个类需要我们自己...
void指针void指针void指针void指针void指针
指针精通指针精通指针精通指针精通指针精通指针精通指针精通指针精通指针精通指针精通指针精通指针精通
我知道函数指针是指向函数的指针,指针函数还是指一个函数的返回值是一个指针,但下面 的几道题还是感觉很迷惑。各位能否讲的详细点呢? (1)float(**def)[10] def是什么? (2)double*(*gh)[10] gh是什么? (3)double...
彩色荧光鼠标指针鼠标指针
易语言取类指针及方法指针源码,取类指针及方法指针,线程调用,取方法指针,方法1,方法2,lstrcpynA
2.在一个表达式里,*p[] 将被求值为一个int 整数,所以p[]必须指向一个int 整数,而p是一个int 指针数组。指针数组p里的5个元素(5个)指针被初始化为分别指向数组a里的5个元素。 3.**pp代表着一个int整数,所以*pp...
指针类型 11.1 指针 11.2 单链表 11.1 指针 11.2 单链表
指针是C语言的精华,然而,很多人学习了 C 基础知识却始终对 C 指针不得要领,长期被 C 指针困扰,所以给大家推荐此书,本书作者运用了许多生动与亲切的例子,深入浅出地讲透了 C指针的原理与机制,并辅以编程实践中...
透明鼠标指针 透明鼠标指针透明鼠标指针透明鼠标指针透明鼠标指针透明鼠标指针透明鼠标指针
我这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及...
指针函数和函数指针变量指针 函数和函数指针变量
指针, 指针的指针, 数组, 指针数组, 数组指针, 指针函数, 函数指针 CC++中函数指针的含义
指针的总结指针的总结指针的总结指针的总结指针的总结指针的总结指针的总结指针的总结指针的总结指针的总结