基于非虚拟模板的类 - 泄漏内存?

时间:2012-01-01 20:10:02

标签: c++

基于book,pp338

#include <iostream>
#include <vector>
#include <string>
#include <ostream>
#include <algorithm>

#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/cast.hpp>

using namespace std;

template <typename R, typename Arg> class invoker_base {
public:
  virtual R operator()(Arg arg)=0;
};

template <typename R, typename Arg> class function_ptr_invoker 
  : public invoker_base<R,Arg> {
  R (*func_)(Arg);
public:
  function_ptr_invoker(R (*func)(Arg)):func_(func) {}

  R operator()(Arg arg) {
    return (func_)(arg);
  }
};

template <typename R, typename Arg> class function1 {
  invoker_base<R,Arg>* invoker_;
public:
  function1(R (*func)(Arg)) : 
    invoker_(new function_ptr_invoker<R,Arg>(func)) {}

  R operator()(Arg arg) {
    return (*invoker_)(arg);
  }

  ~function1() {
    delete invoker_;
  }
};

bool some_function(const std::string& s) {
  std::cout << s << " This is really neat\n";
  return true;
}

int main() {
  function1<bool,const std::string&> f1(&some_function);
  f1(std::string("Hello"));
}

问题&GT; invoker_base的默认析构函数不是虚拟的。 function1的实现中是否存在内存泄漏?如代码所示,function1::~function1通过非虚基类指针删除分配的资源。

2 个答案:

答案 0 :(得分:6)

此处没有内存泄漏(该对象不拥有需要delete的任何资源)。

但是,在没有虚拟析构函数的情况下通过指向base的非基础对象调用delete会导致未定义的行为。

答案 1 :(得分:4)

别担心:没有内存泄漏!但是,您应该担心的是,您调用了未定义的行为。啊,好吧,这可能表现在内存泄漏中,但它也可以以任何其他方式表现出来。规则非常简单:如果在静态类型与动态类型不匹配的指针上调用delete,则表明存在未定义的行为。请注意,未定义的行为通常意味着它可以完美地工作,但是当有大量的钱时,它会失败,例如如果这个演示有效,客户准备同意数百万的交易 - 它不会。