由买买提看人间百态

topics

全部话题 - 话题: dtor
1 2 3 下页 末页 (共3页)
X*4
发帖数: 101
1
来自主题: Programming版 - 这个dtor为啥能被调用呢
关于boost shared_ptr的,
#include
#include
#include
class A{
public:
virtual void sing() = 0;
protected:
virtual ~A(){
std::cout << "dtor of base" << std::endl;
}
};
class B: public A{
public:
virtual void sing()
{
std::cout << "DO re mi fa so la" << std::endl;
}
~B(){
std::cout << "Dtor of Derived " << std::endl;
}
};
boost::shared_ptr create(){
boost::shared_ptr
p(new B());
...
阅读全帖
b***k
发帖数: 2673
2
来自主题: Quant版 - [合集] C++: protect dtor (转载)
☆─────────────────────────────────────☆
ccca (cc) 于 (Wed Jul 2 16:47:44 2008) 提到:
发信人: ccca (cc), 信区: Programming
标 题: C++: protect dtor
发信站: BBS 未名空间站 (Wed Jul 2 16:46:22 2008), 转信
C++ coding standards 101:
50:
Make base class destructors public and virtual, or protected and nonvirtual
但是如果 dtor is protected, Base class can't be instantiated...
So dtor must be public and virtual..
所以我想作者是不是搞错了。。。
class A
{
protected:
~A();
}
int main()
{
A a;
A* p=new A()
c**a
发帖数: 316
3
来自主题: Programming版 - C++: protect dtor
C++ coding standards 101:
50:
Make base class destructors public and virtual, or protected and nonvirtual
但是如果 dtor is protected, Base class can't be instantiated...
So dtor must be public and virtual..
所以我想作者是不是搞错了。。。
class A
{
protected:
~A();
}
int main()
{
A a;
A* p=new A();
return 1;
}
s***e
发帖数: 122
4
来自主题: Programming版 - C++: protect dtor
让dtor为protected和nonvirtual就是为了让基类不能被instantiated,但是又可以让
子类的dtor调用到吧。

nonvirtual
g*********s
发帖数: 1782
5
来自主题: Programming版 - Quick Q: data member class's dtor order
Class ABC {
};
Class XYZ {
private:
ABC abc;
}
XYZ的dtor和ABC的dtor谁先被调用啊?突然想不起来了。
p***o
发帖数: 1252
d*******d
发帖数: 2050
7
来自主题: Programming版 - one question about operator delete
我猜测啊,在你有virtual dtor的情况时,你delete 的时候,要先走dtor,然后是clas
s里面的delete,可是你delete了一个null,编译器无法从null找到vtable然后fetch出dt
or,所以直接就完了,没有走下去。
而你注释掉virtual dtor后,走的是default dtor,default dtor不用走vtable,所以总
是call了,default dtor没做什么,但是又接着call delete。
p*u
发帖数: 2454
8
来自主题: Programming版 - some C++ interview questions

There are many cases when you surely don't want your class to be base class
of other classes. By making a dtor non-virtual, a class is not supposed to be
derived from. As for performance, virtual dtors increase the size of
object(pointer to vt). The problem with virtual dtors is not only the
overhead associated with dynamic binding but also because most dtors are
either explicitly or implicitly inlined. virtual dtors cannot be inlined.
don't quite understand the question...
make the operator()
p*****d
发帖数: 80
9
来自主题: Programming版 - c++ singleton questions
singleton
1. ctor: 必须private
否则会允许出现多个instance,这个和singleton的定义矛盾。而且必须定义无参数的ctor,否则编译器默认会定义一个。
2. get_instance method:必须static
否则无法在没有singleton instance的情况下调用产生第一个也是唯一一个instance。
3. copy ctor:必须private
否则下面的语句会出现两个instance
S *s = S::get_instance();
S s1(*s);
4. assignment optr:不必private
因为不会出现第二个instance,所以编译器默认生成的assignment operator只能自己assign自己,无效果。
5. dtor:看情况
dtor可能是有用的,如果允许用户自己释放singleton的话,因为singleton的定义
是无论何时在系统中最多有一个instance存在,可以是1个也可以是0个。但通常是定义一个release函数来free分配的内存而不是使用dtor。但即使dtor是public... 阅读全帖
p*****d
发帖数: 80
10
来自主题: Programming版 - c++ singleton questions
singleton
1. ctor: 必须private
否则会允许出现多个instance,这个和singleton的定义矛盾。而且必须定义无参数的ctor,否则编译器默认会定义一个。
2. get_instance method:必须static
否则无法在没有singleton instance的情况下调用产生第一个也是唯一一个instance。
3. copy ctor:必须private
否则下面的语句会出现两个instance
S *s = S::get_instance();
S s1(*s);
4. assignment optr:不必private
因为不会出现第二个instance,所以编译器默认生成的assignment operator只能自己assign自己,无效果。
5. dtor:看情况
dtor可能是有用的,如果允许用户自己释放singleton的话,因为singleton的定义
是无论何时在系统中最多有一个instance存在,可以是1个也可以是0个。但通常是定义一个release函数来free分配的内存而不是使用dtor。但即使dtor是public... 阅读全帖
q****x
发帖数: 7404
11
来自主题: Programming版 - 几个C++书写风格疑问
都是关于书写风格的。
1. 有必要手动禁用default ctor吗?
class A {
public:
explicit A(int i) : data_(i) {}
private:
int data_;
};
class A {
public:
explicit A(int i) : data_(i) {}
A() = delete;
private:
int data_;
};
有人认为第一个写法就够了,编译器不会自动生成default ctor。有人认为第二个写法
好,直接告诉用户default ctor是要禁用的,以免用户不小心又添加了default ctor。
谁有道理?
2. 纯虚类的虚函数声明。
纯虚类里只要有一个函数为虚,则所有都为虚。但声明纯虚时可以有多个变种如下。哪
个规范?
第一个写法,把所有的虚函数都声明为纯虚。
class A {
public:
virtual ~A() = 0;
virtual void foo() = 0;
virtual void bar() = 0;
};
inline A::~A() = d... 阅读全帖
f****4
发帖数: 1359
12
来自主题: JobHunting版 - When do we need user defined destructor?
他的意思是自己定义dtor吧?
我的感觉是,如果你没用智能指针来处理资源(例如内存),你就要在dtor里面手工释放
如果你需要进行异常处理,dtor应该是最后的一个守门员
如果你需要进行引用计数的话,dtor就必须用来 计数--
d*******d
发帖数: 2050
13
来自主题: Programming版 - one question about operator delete
我试验了一下,只要自己写了dtor,无论是不是virtual的,delete都忽略了。
如果没有写dtor, delete执行了。
你的解释还是不够清楚,我还是很困惑。
自己不写dtor,系统也得先call default dtor啊,这个时候系统也会知道这是个null p
tr,也可以忽略delete啊。
z****e
发帖数: 2024
14
来自主题: Programming版 - 老调重弹 virtual destructor
请问,virtual dtor 以后,下面派生子类,派生子类的派生子类,子子孙孙,他们的
dtor都自动virtual 了么?
还是,无论当前类的基类是不是有virtual dtor,只要从当前类,想派生子类,必须把
当前类的dtor显示声明为virtual?
早谢。
p***o
发帖数: 1252
15
来自主题: Programming版 - Forward declaration with unique_ptr
It's a feature: the dtor of unique_ptr need to see the dtor of B.
So A's dtor must see B's dtor as required by it's member myptr.
z****e
发帖数: 2024
16
来自主题: JobHunting版 - Placement new的一个问题
看你dtor里边写什么了吧。
如果dtor本身什么都没有,我个人觉得没事。
如果你dtor里写了东西,就算一句cout,少了屏幕输出,用户是不是也不愿意?
t****u
发帖数: 8614
17
来自主题: Programming版 - a c++ question
if you don't have copy-ctor, it just does a member wise copy,
so mp ps->mp will be duplicated to ps2.mp.
your "delete ps", will be supposed to delete the mp in your screen class'
dtor, (otherwise, you will have memory leak). When the function ends, ps2's
dtor will get called. It will try to delete ps2.mp (the same pointer as ps->
mp which is already deleted in ps's dtor), then crash.

crash.
s**********b
发帖数: 7
18
来自主题: Programming版 - one question about operator delete
这个仍然是base class, 所以有没有virtual效果一样,跟virtual没关系
c++处理delete null pointer,是直接忽略的(C是crash),所以当你自己写dtor
系统会调用你的dtor,系统会知道你这个是null ptr,所以直接忽略delete p;
如果你不自己写dtor,系统掉methods是直接class methods存的address+offset找
methods,所以delete被当作普通methods调用,就会不会忽略delete call. (我不确定
,不过好象解释的通)

clas
dt
B*****t
发帖数: 335
19
来自主题: Programming版 - 没有经过构造函数???
请教一下这段代码有两个object被构造k和x, 但在G++里面为什么只调用了一个
dtor,看了一下汇编代码,只有x被的dtor被调用了,k的dtor为什么没有被调用?
而且refc x=f10();这句并没有调用copy ctor。why?
refc f10(){
refc k;
cout<<"k exist()"< return k;
}
int main(int argc, char* argv[ ]){
refc x=f10();
}

[class.temporary]
p*****d
发帖数: 80
20
来自主题: Programming版 - c++ singleton questions
如果你的代码里的get_X改成static,在理论上是可以的。
我说的那五条里面只有最后一条需要改:dtor必须是private的,而且不能有release函
数,因为在singleton中可能会有其他的member是class,如果dtor被调用会出现double
free的问题,也就是说一些资源在s->~S()时被free了一次,最后调用s_instance的
dtor时又会被free一次。
但是,这不是好的做法,因为你失去了对资源何时建立以及释放的控制权。static S s
_instance在程序开始前被调用的问题有很多:比如初始化其中资源可能依赖于其他的
数据,而程序开始前这些数据尚未准备好,所以初始化这些资源是没有意义的;另外一
个问题是static变量的初始化顺序并不统一,理论上讲是header file被include的顺序
,但各个编译器实现并不一样,因此如果多个static的instance初始化不独立的话,这
会带来undetermined behavior,所以要尽可能避免class的静态instance。
p*****d
发帖数: 80
21
来自主题: Programming版 - c++ singleton questions
如果你的代码里的get_X改成static,在理论上是可以的。
我说的那五条里面只有最后一条需要改:dtor必须是private的,而且不能有release函
数,因为在singleton中可能会有其他的member是class,如果dtor被调用会出现double
free的问题,也就是说一些资源在s->~S()时被free了一次,最后调用s_instance的
dtor时又会被free一次。
但是,这不是好的做法,因为你失去了对资源何时建立以及释放的控制权。static S s
_instance在程序开始前被调用的问题有很多:比如初始化其中资源可能依赖于其他的
数据,而程序开始前这些数据尚未准备好,所以初始化这些资源是没有意义的;另外一
个问题是static变量的初始化顺序并不统一,理论上讲是header file被include的顺序
,但各个编译器实现并不一样,因此如果多个static的instance初始化不独立的话,这
会带来undetermined behavior,所以要尽可能避免class的静态instance。
q****x
发帖数: 7404
22
来自主题: Programming版 - Forward declaration with unique_ptr
by "must see", you mean dtor of unique_ptr must be in the same compilation
unit as B's dtor does? but why the location of A's dtor matters?
q****x
发帖数: 7404
23
来自主题: Programming版 - C++设计疑问
foo.h
class A {
// copy ctor and assignment disabled
};
class B {
// copy ctor and assignment disabled
};
class C {
// copy ctor and assignment disabled
};
bar.h
#include "foo.h"
class D {
public:
void bar {
for (auto it : pack_map_) {
// do sth
}
}
~D() {
for (auto it : pack_map_) {
it.second.Clear();
}
}
private:
struct Pack {
A* a;
B* b;
C* c;
void Clear() {
delete c; delele b; delete a;
}
};
map pack_map_;
... 阅读全帖
p***o
发帖数: 1252
24
来自主题: Programming版 - 这二个在C++中有区别不?

这种最基本的东西随便一本靠谱的C++书都解释得很清楚。
Java没dtor,靠GC管理内存。没dtor管理其他资源实在不方便,
最后Java 7加了个AutoCloseable和try一起当dtor用。
p***o
发帖数: 1252
25
来自主题: Programming版 - 这二个在C++中有区别不?

这种最基本的东西随便一本靠谱的C++书都解释得很清楚。
Java没dtor,靠GC管理内存。没dtor管理其他资源实在不方便,
最后Java 7加了个AutoCloseable和try一起当dtor用。
y**b
发帖数: 10166
26
来自主题: Programming版 - C++含有指针成员的类
对比两个代码和输出:
比较奇怪的就是智能指针reset不调用dtor,
内置指针delete调用dtor。
行为上不一样。或者说智能指针怎么调用dtor用户根本就不应该知道?
c****p
发帖数: 32
27
来自主题: JobHunting版 - 问个C++重新编译的问题
嗯,但是也可以从另一个方面来说不需要recompile.

如果已经explicitly 有了其他ctor,加入新的没有影响。
这个基本上是要重新compile,一个例外是加入原来的class本来就只是method的封装比
如:
class Methods
{
public:
staic void test1();
}
这样加入new member fields也没什么关系(但是如果client code有类似sizeof(
Methods)的就不行)
这个一定要重新compile.其他的例子都可以找到反例(虽然有点急转弯的意思),但是
因为dtor是一定要被用到的,如果原本的dtor变成virtual,那么client端整个调用过
程就变了。原来是:
$Class_Dtor();
变成virtual后变成了
pClass->vtbl[index_of_dtor]();
所以client端必须重新compile.
反例是如果这个member function根本就没用到:D
w****m
发帖数: 146
28
Sorry for thr confusion, I should clarify it: If during stack unwinding a
dtor throws an exception and it is not caught and handled, the terminate()
function will be called. So be prepared to catch any potential exception in
dtor
w****g
发帖数: 4
29
来自主题: Programming版 - one question about operator delete
从编译器产生的代码看,有dtor时, 检查是否为0,是0则马上返回。
没有dtor时,直接调operator delete()
不知道这样设计有什么依据
l*******D
发帖数: 282
30
来自主题: Programming版 - 问一个empty class的size的问题
一个class,没有任何data member
用sizeof在该class上,输出多少?
我觉得如果没有virtual function的话应该输出4,因为有四个function pointer,指
向compiler自动生成的ctor,dtor,operator=和copy ctor
但是刚在VC上test了一下,竟然输出1
另外declare了virtual dtor之后输出变成了4,很不明白
牛人解释一下吧,谢谢
t****t
发帖数: 6806
31
来自主题: Programming版 - find bugs of c++ codes
the expected answer should be C and C, but the 2nd C is not exactly right.
you can call virtual functions in ctor/dtor, however they will not be
overrided in ctor/dtor, but they are treated as regular member functions. it
is implied the get_name() is not defined (being pure virtual), but actually
pure virtual member can also be defined.
See 12.7, clause 3
t****u
发帖数: 8614
32
4 is due to Var2 = (Base) *Var;
invoke an operator=(), you don't have it, so this is member-wise copy. A
temp object is still constructed through assignment operator, instead of
using default ctor. Since you slice the object, you only see the dtor of
base class.
5,6 is due to delete
7 is the "Base Var2;"
When out of the method scope, the dtor is called.
z****e
发帖数: 2024
33
来自主题: Programming版 - Interview question: is the following code OK?
class X{
static X* p;
public:
void gen(){
p=new X;
}
~X(){
delete p;
}
};
X* X::p=0;
int main(){
X x;
x.gen();
}
你把~X()放在火上烤啊?
在dtor退出以前,对象就没有鸟。但是,岂不循环delete了?
加一个member fun:
void X::del(){
delete p;
p=0;
}
把dtor里边的delete 去掉。
看起来就是这个样:
class X{
static X* p;
public:
X(){
}
void gen(){
p= new X;
}
void del(){
delete p;
p=0;
}
~X(){
//delete p;
}
};
X* X::p=0;
z****e
发帖数: 2024
34
来自主题: Programming版 - Interview question: is the following code OK?
你那个第5点,说是map的node重复delete问题。
如果是的话,map的node每次delete完了,就置0不就完了么?难道map不这么作?
其实就是递归delete的问题啊??就是map来没来得及把自己那个节点置零,就必须销毁一个正在调用自己dtor的对象。
class D{
public:
~D(){
this->~D();
}
};
你试试?不就这么回事么?哪用你说得那么复杂呢?
比如我那个例子里面,delete置零都没用,因为还没有来得及置零,就必须递归调用同一个dtor了。
大家说说吧。

pointer'
triggered
z****e
发帖数: 2024
35
来自主题: Programming版 - Interview question: is the following code OK?
smart pointer 不是 绝对不是 永远不是 pointer!
smart pointer 就一user defined class 对象而已。
pointer 里边只有机器地址,没有dtor。
而smart pointer 有dtor。

析构
z****e
发帖数: 2024
36
来自主题: Programming版 - Interview question: is the following code OK?
我觉得呀,这个题目就是递归delete问题。
我的第一个例子,是普通指针,递归delete会产生重复delete问题非零指针。(置零无法解决。)
我的第二个例子,是用户类型,递归delete会产生递归析构问题。(同样置零无法解决。)
而你的答案,和我的答案的本质区别,就是,你认为是“重复delete”,但是我认为不是“重复”,而是“递归”。
你说的“重复”,是可以用置零的办法解决的。但是递归呢,就不行。
所以,我觉得我第二个例子,自己调用自己dtor那个,
应该就是你这个题目的答案了吧?
第一个例子的精神思想是对的,但是也不能算全错吧?
所以我觉得我那个第7楼的回答,里边的精神仍然闪闪发光啊!
你当时把我一棒子打死啊!
你给说说看。啊?
最后,当ref=0,Foo被销毁的时候,同一个shared_ptr对象,要以递归形式,两次进入自己的dtor。
你觉得这个说法如何?
p***o
发帖数: 1252
37
来自主题: Programming版 - Interview question: is the following code OK?
shared_ptr两次进入自己的dtor没问题,问题是第二次进入的时候ref=-1,
把invariant破坏了,多调了Foo::~Foo()一次。你在那里放个assert就能
发现这个问题。

次进入自己的dtor。
e****d
发帖数: 895
38
来自主题: Programming版 - c++ singleton questions
Calling dtor twice has nothing to do with singleton.
The same thing applies to calling dtor explicitly for
block scope objects.

double
s
e****d
发帖数: 895
39
来自主题: Programming版 - c++ singleton questions
Calling dtor twice has nothing to do with singleton.
The same thing applies to calling dtor explicitly for
block scope objects.

double
s
J**********y
发帖数: 1891
40
#include "stdafx.h"
#include
#include
using namespace std;
class Base
{
public:
Base(){ cout << "Base-ctor"< ~Base(){cout << "Base-dtor"< virtual void f(int) {cout << "Base::f(int)"< virtual void f(double) {cout << "Base::f(double)"< virtual void g(int i=10) {cout << "Base::g()"< void g2(int i=10) {cout << "Base::g2()" << i< };
class Derived : public Base
{
public:
Derived() {cout << "Derived-ctor... 阅读全帖
q****x
发帖数: 7404
41
来自主题: Programming版 - Forward declaration with unique_ptr
oh, you mean the real code for A's, generated by the compiler, will contain
unique_ptr's dtor, which in turn will contain B's dtor, correct?
q****x
发帖数: 7404
42
来自主题: Programming版 - 几个C++书写风格疑问
dtor算不算必须override的?如果算,只标注dtor不就好了?
这个建议更复杂啊。子类标override要和基类的=0一一对应…
y**b
发帖数: 10166
43
来自主题: Programming版 - C++含有指针成员的类
实际代码就是这样的,只是B的dtor放在.h里面,所以有一楼的提示,但是编译没有问
题。
我试着把B的dtor移到B.cpp里面,反而无法编译:
error: definition of implicitly-declared B::~B()’
实际代码里面B是个抽象类,但是其派生类也有一楼提示。
y**b
发帖数: 10166
44
来自主题: Programming版 - C++含有指针成员的类
也就是说与reset无关,reset不调用dtor?
实际上reset已经让count减到0,vector clear也无法再减,但是判断是0之后调用dtor?
r********n
发帖数: 7441
45
玩C++的对这个ctor/dtor结构很熟悉吧
f*******e
发帖数: 1161
46
来自主题: JobHunting版 - 问个C++题
把ctor声明为私有,也一样不可以创建。
你可以把dtor声明为私有,但是重载operator delete就好了应该,没具体测试。
B*******g
发帖数: 1593
47
来自主题: JobHunting版 - 发面经攒rp —— Bloomberg
如果是protected/private ctor你得用Named Constructor Idiom 才能instantiate(也
许还有其他办法),那个问题的意思应该是
CLASS * a = new CLASS(); 是允许的
但是不允许
CLASS b;
b 在out of scope的时候会自动被销毁,但是dtor不是public 所以compiler会报错
s******u
发帖数: 501
48
来自主题: JobHunting版 - 发面经攒rp —— Bloomberg
但是你同样也不能用delete a来销毁这个object,容易导致memory leak
还是用factory好说话一点吧
private ctor, make it friend to factory class, use factory to instantiate/
destroy object
不过关于private dtor的这点倒是学习了,呵呵

(也
w****m
发帖数: 146
49
来自主题: JobHunting版 - When do we need user defined destructor?
when you call placement new function, a explicit dtor needs to be called
w****m
发帖数: 146
50
sometimes when exception is thrown in dtor, it will cause stack unwinding
1 2 3 下页 末页 (共3页)