用于删除指针的c++函函数似乎有效

c++ functor for deleting pointers seems to work

本文关键字:函数 有效 c++ 删除 指针 用于      更新时间:2023-10-16

对于用于删除vector

中的指针的函子,建议使用以下方法
struct DeleteFromVector
{
    template <class T>
    void operator() ( T* ptr) const
    {
            delete ptr;
    }
};
使用 调用

std::for_each(aVec.begin(), aVec.end(), DeleteFromVector());

我已经写了类似的东西(虽然最初没有巧妙地将模板移动到结构体中):

    struct DeleteObj 
    {
        template<typename ObjType>
        inline void operator() (ObjType obj)
        { 
            delete obj; 
            obj = NULL; 
        };
    };

在调试器中逐步执行它似乎可以工作,即obj被识别为指针并且没有崩溃。

我有点困惑,为什么两者都能工作,也想听听关于在这些中使用const和inline的意见。

谢谢,罗伯特。

首选第一种方法,因为它仅在vector元素类型为指针时才能编译。如果vector元素类型可转换为非空指针,则第二种方法将编译,这可能会导致灾难性的后果。

函子通常声明为const,通常没有什么区别,但也不需要任何开销

为什么两个模板都可以工作?

在第一个模板中,您将Obj*传递给接受T*的模板方法,因此编译器推断TObj

在第二个模板中,您将Obj*传递给接受T的模板方法,因此编译器推断TObj*


inline

inline在这里是多余的,因为在类定义中定义的成员函数是隐式的inline


使用const

如果可能的话,

函子的operator()应该声明为const。这是因为传递临时的非const引用是非法的。对std::for_each(...,..., Functor());的调用可能无法编译,除非Functor有一个operator(T)const

这个问题被Microsoft编译器实现的一个非标准扩展所混淆,该扩展允许通过非const引用传递临时对象,并在默认情况下启用这种非标准行为。

  • 为什么两者都工作:如果你调用operator()(U*),第一个匹配T = U,第二个匹配ObjType = U*

  • const:这只是说你没有修改任何成员,但是因为你的结构是空的,这没有什么区别。有些算法可以将其函子作为const,因此只允许访问常量成员函数(但在for_each中不允许)。在任何情况下,你的成员函数最好是静态的,因为没有状态。

  • 内联只是一个编译器提示;无论如何,构造都可能是内联的。类定义中的成员定义无论如何都是隐式内联的。

它可以工作,因为ObjType被推断为WhateverTypeYouHaveInYourVector *。对于第一个解,T推导为WhateverTypeYouHaveInYourVector。后者更好,因为它要求实参是一个指针,而在您的解决方案中,实参可以是任何东西,甚至是不可删除的东西。

顺便说一下,obj = NULL是无用的,因为您按值接受参数。因此,将被设置为空的指针是函数的本地副本,而不是vector中包含的指针。可以使用指针的引用:

struct Deleter
{
    template <typename T>
    void operator()( T * & ptr) const
    {
        delete ptr;
        ptr = 0;
    }
};

两者都有效,因为它们都正确地推导了模板参数,在一种情况下它是指针,在另一种情况下它是指向的类型,因为签名已经包含了*

inline在这里是多余的,因为函数已经是内联的。另外,设置obj = NULL是无用的,因为它只将指针的本地副本设置为0,而不是——正如可能的那样

第二个例子可能不起作用,因为您没有从中创建一个指针:

inline void operator() (ObjType* obj)

这应该可以工作,就像上面的例子。

inline是一个编译器优化建议将函数完全复制到每个调用它的地方。

const关键字有许多用途,这取决于您在哪里使用它。在你的例子中(在第一个例子中),这意味着调用方法的类或对象不能改变,可以在const上下文中使用。

相关文章: