我尝试将std :: shared_pointer与删除器一起使用。我试图使用成员函数作为删除器。但它无法编译。编译器给了我一个错误消息,但我无法理解为什么它不起作用。有谁知道它为什么不起作用?非常感谢你。
简化代码如下,
#include <memory>
class MemberFunctionPointerInConstructor {
public:
MemberFunctionPointerInConstructor(void) {
std::shared_ptr<int> a = std::shared_ptr<int>(new int(1), deleter); // this line makes a compiler error message
}
void deleter(int* value) {
delete value;
}
};
编译器的错误消息如下:
error: invalid use of non-static member function
std::shared_ptr<int> a = std::shared_ptr<int>(new int(1), deleter);
^
非常感谢。
答案 0 :(得分:8)
要使用未绑定到类实例的成员函数,您必须声明方法static
static void deleter(int* value) {
delete value;
}
答案 1 :(得分:3)
如果要将非静态成员函数用作删除器,则必须将其绑定到实例 - 但请注意,在调用删除器时,实例仍需要处于活动状态。例如,
class ShorterName {
public:
ShorterName(void) {
using namespace std::placeholders;
auto a = std::shared_ptr<int>(new int(1),
std::bind(&A::deleter, this, _1));
}
void deleter(int* value) {
delete value;
}
};
如果您不需要特定实例,可以将该功能设置为静态,因此它不需要实例。
class ShorterName {
public:
ShorterName(void) {
auto a = std::shared_ptr<int>(new int(1), deleter);
}
static void deleter(int* value) {
delete value;
}
};
答案 2 :(得分:3)
有几种方法可以解决这个问题。如果您实际上是指非静态成员函数,那么这样做的一种方式(不是唯一的方法)将通过lambda function:
class MemberFunctionPointerInConstructor {
public:
MemberFunctionPointerInConstructor() {
std::shared_ptr<int> a = std::shared_ptr<int>(
new int(1),
[this](int *p){this->deleter(p);});
}
void deleter(int* value) {
delete value;
}
};
答案 3 :(得分:1)
答案很简单。
static void deleter(int* value) {
delete value;
}
你必须使函数变为静态,否则它可能会使用该类的成员变量,只有在有一个实例可以完成时才会这样做,而且情况并非如此。