作者telgniw (Celia)
看板EE_DSnP
标题[讨论] 关於上一堂课的newOp.cpp
时间Thu Nov 12 23:21:44 2009
老师有提到说如果把destructor去掉的话会出问题
可是我实际测试的结果是没有影响耶
输出来的记忆体位置和operator new与operator delete接到的size都没有改变
刚刚翻了一下The C++ Programming Language也没有找到
不过看到一个(可能)有点相关的东西:
如果类别长这样:
class A {
public:
void *
operator new(size_t);
void operator delete(
void *, size_t);
};
class B:
public A {
public:
...
};
这样以下的code:
A *ptr =
new B;
delete ptr;
在delete的时候编译器会把A的大小塞给size_t,而不是给它B的大小
所以我们要在A里面加上virual destructor:
virtual ~A() {}
因为释放记忆体是由destructor负责(它知道物件的大小),而A(基底类别)有destructor
可以确保所有的衍生类别都有destructor(才能得到正确的大小)
// 其实上面这里我没有看很懂orz
这样delete的时候才不会有问题
不过呢我实际测试的结果目前delete抓到的还是A的delete(也是A的大小)
但是如果在A::operator delete里面有free传进来的指标的话会出现segmentation fault
所以应该是在那之前(比方说~B()被呼叫时)就已经把记忆体释放了
可是却不是用我写的B::operator delete释放的
慢慢研究中...
PO出来看看有没有人知道原因或者有什麽想法(或者不同系统跑出不一样的结果之类的)
可以大家讨论一下:D
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.45.181.158
1F:推 ric2k1:是我讲错了, 请见下面一篇说明! 11/12 23:53