编辑:显然问题表述不够清晰。我遇到的问题是,当析构函数在头文件中定义时,它会添加到多个.obj文件中,从而导致链接器出现问题。实际问题是:
当我将析构函数添加到DLL项目中的CPP文件中,并使用动态加载和接口头文件使用dll时,基类析构函数是否仍然被调用以防止内存泄漏?
我正在使用MSVC 10.0,并具有实现接口的DLL项目。该接口是一个抽象(纯虚)基类。想法是使用头文件与库的动态加载。因此,我使用了纯虚析构函数来确保基类中的析构函数被调用。以下是示例代码以解释此内容:
//ISplitter.h
#pragma once
struct param {
int something;
}
class ISplitter {
public:
virtual ~ISplitter() = 0;
virtual void useful() = 0;
}
ISplitter::~ISplitter() {
/* Make sure base class destructor gets called */
}
主要实现头文件
//CSplitter.h
#pragma once
#include "CHelper.h"
#include "ISplitter.h"
class CSplitter : public ISplitter {
private:
CHelper hlp;
public:
~CSplitter();
void useful();
}
一些辅助类
//CHelper.h
#pragma once
#include "ISplitter.h" // I need the struct
// Class definition should go here but is irrelevant
现在问题是链接器生成了一个错误,告诉我析构函数:ISplitter::~ISplitter(void) 已经被多次声明,系统将无法构建。 错误:
CHelper.obj : error LNK2005: "public: virtual __cdecl ISplitter::~ISplitter(void)" (??1ISplitter@@UEAA@XZ) already defined in CSplitter.obj
怎么正确地解决这个问题?我已经将析构函数放在ISplitter.cpp中,但我担心如果我动态加载库并向上转换基类到ISplitter,这种方法可能行不通。
ISplitter::ISplitter()
,我假设缺少了一个~
? - user2100815inline
。这样可以解决多重定义的问题。 - Bo Persson