我读到析构函数不能共享,这是真的吗?
我有一个带有几个子类的基类,这些子类的析构函数不会改变。这将导致一些重复的代码。
可以共享析构函数吗?如果没有,我该如何避免这些析构函数中的重复代码呢?
Class A{
public:
~A() {
//do something
}
};
class B: public A{
};
class C: public A{
};
class D: public A{
};
现在,我希望B、C和D具有与A相同的析构函数。
在D wiki - 上有一个关于C++接口的页面
它说,您可以链接到C++代码,但不能链接到特殊的方法,包括构造函数、析构函数和运算符重载,因为对象的生存期问题。建议要么使用包装器(并在C/C++端构造对象),要么用D重新实现构造函数。这两种方法都需要做大量工作,有时可能是不可能的。如果您想在您的D程序中使用一些C++库,这是一个很大的问题:例如,您希望使用Qt的QML,并且可以定义与extern(C++)...一起使用的所需的类,但是您仍然需要构造函数和许多包装器(比如dqml项目做的)或移植代码。
但有一种方式看起来很有效。简单的例子:
//class.h
class MyTestCla
我有一个包含向量成员变量的类。我知道存储在堆栈上的向量会在它们超出作用域时被清除(即内存释放),但我不确定销毁一个类对象-它包含一个向量成员变量-是否被认为是超出作用域的。
如果不是,那么销毁向量的合适方法是什么?
例如:
class fred {
char *stuff;
vector<int> v;
fred() : stuff(), v() {}
~fred() {
if (stuff) free(stuff);
// now how do I clear up the vector v? Will it
我理解为什么会发生这种情况,但是当我的程序退出时,我的代码在生成错误(从而导致崩溃)时,我的代码一直在努力解决it...here。
pure virtual method called
SomeClass::~SomeClass()
{
BaseClassObject->SomePureVirtualMethod(this);
}
void DerivedClass::SomePureVirtualMethod(SomeClass* obj)
{
//Do stuff to remove obj from a collection
}
我从来没有调用过new SomeCl
在这种情况下,我有一个类在构造函数中分配内存,并在析构函数中释放它--非常基本的东西。如果为类的新实例重用类实例变量,则会发生问题。当最终(并且只有最终)实例在超出作用域时被销毁时,它将在调用空闲/delete时与SIGABRT崩溃:
malloc: *** error for object 0xXXXXX: pointer being freed was not allocated
我觉得我错过了一些基本的东西,我想要理解我的错误,这样我就可以在将来避免它。
这里有一个简单的复制:
class AllocTest {
public:
AllocTest(const char *c)
抱歉,如果这个问题听起来很愚蠢,我正在跟随专家在SO中尝试一些例子,这就是其中之一。我确实尝试了搜索选项,但没有找到这种类型的答案。
class A
{
public:
A(){cout<<"A Contruction"<<endl;}
~A(){cout<<"A destruction"<<endl;}
};
int main()
{
vector<A> t;
t.push_back(A()); // After this line, whe
接口需要虚拟析构函数,还是自动生成的?例如,下面两个代码段中哪一个是最好的,为什么呢?请注意,这是全班学生。在Java语言中,没有其他方法、变量等,这是一个“接口”.
class Base
{
public:
virtual void foo() = 0;
virtual ~Base() {}
};
或者..。
class Base
{
public:
virtual void foo() = 0;
~Base() {} // This line can be omitted, but included for clarity.
};
编辑由于“不是我想要的”答
我最近第一次用Visual检漏检测器分析了我的代码,它指示了向量中的泄漏,这是我没想到的。代码如下:
void func()
{
std::vector<MsgUnit> msgVec;
do
{
// msgVec.clear(); // do I need to do this to avoid a leak?
msgVec = m_obj->returnMsgUnitVector();
}
while (someConditionNotMet);
// process msgVec
program Project1;
type
ob = class
num: integer;
constructor init(id: integer);
destructor done();
end;
constructor ob.init(id: integer);
begin
self.num := id;
end;
destructor ob.done();
begin
end;
type
plist = ^list;
list = record
myob: ^ob;
Next: pli