应该在哪里声明纯虚拟析构函数?

Wou*_*ons 1 c++ memory-leaks linker-errors virtual-destructor

编辑:显然问题没有明确表达.我遇到的问题是,当在头文件中定义析构函数时,它会被添加到多个.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 */
}
Run Code Online (Sandbox Code Playgroud)

和主要的实现标题

//CSplitter.h
#pragma once
#include "CHelper.h"
#include "ISplitter.h"


class CSplitter : public ISplitter {
private:
    CHelper hlp;
public:
    ~CSplitter();
    void useful();
}
Run Code Online (Sandbox Code Playgroud)

一些助手班

//CHelper.h
#pragma once
#include "ISplitter.h" // I need the struct

// Class definition should go here but is irrelevant
Run Code Online (Sandbox Code Playgroud)

现在问题是链接器生成一个错误,告诉我析构函数:ISplitter :: ~ISplitter(void)已被多次声明,系统将不会构建.错误:

CHelper.obj : error LNK2005: "public: virtual __cdecl ISplitter::~ISplitter(void)" (??1ISplitter@@UEAA@XZ) already defined in CSplitter.obj
Run Code Online (Sandbox Code Playgroud)

解决这个问题的正确方法是什么?我已经在ISplitter.cpp中放置了析构函数,但是我担心如果我动态加载库并将基类转发到ISplitter,这可能不起作用.

Pup*_*ppy 6

问题是基类析构函数总是被调用 - 但在这种情况下,你已经使它成为纯虚拟的,所以它不存在.使析构函数纯虚拟的唯一原因是当没有其他成员时强制类是抽象的.在所有情况下都需要定义类的析构函数.

编辑:我误读了你的代码.只需几乎内联地定义析构函数.

virtual ~ISplitter() {}

这里不需要任何纯虚拟,因为您已经拥有其他纯虚拟成员.