![](/img/trans.png)
[英]std::bind a member function to an instance at nullptr causing seemingly random this pointer
[英]std::bind with nullptr pointer
如果我將nullptr
傳遞給std::bind
function,我如何檢查std::function
的有效性?
// Example program
#include <iostream>
#include <string>
#include <functional>
class A
{
std::string si;
public:
A(std::string s) : si(s) {}
int getData(std::string x) {
si += x;
return si.size(); }
};
A* getA()
{
return nullptr;
}
int main()
{
auto fun = std::bind(&A::getData, getA(), std::placeholders::_1);
if (getA() == nullptr)
std::cout << "nullptr";
std::cout << "output : " << fun("str");
return 0;
}
上面的程序拋出分段錯誤。
無法訪問std::bind
返回的 function object 的綁定參數。
你可以在綁定之前檢查指針是否為 null:
if(A* ptr = getA())
{
auto fun = std::bind(&A::getData, ptr, std::placeholders::_1);
如果你真的需要一個 function object 其綁定 arguments 可以從外部訪問,那么你需要編寫一個命名為 function object 的類型。 例如:
struct Fun {
A* ptr;
int operator()(const std::string& x) {
return ptr->getData(x);
}
};
auto fun = Fun{ .ptr = getA() };
if (fun.ptr)
// is "valid"
auto fun = std::bind(&A::getData, getA(), std::placeholders::_1);
您將 function object 中的A
實例綁定到nullptr
。 因此出現分段錯誤。 您應該傳遞A
的有效實例的地址(對於第二個參數),該實例的壽命將超過您創建的此 function object 的調用。
無法追溯檢查 function object 是否有效。 也就是說,在創建它之前,您必須檢查指針是否有效。
這樣的事情更有意義:
A a("hello");
auto fun = std::bind(&A::getData, &a, std::placeholders::_1);
要么
A* ptr = getA();
if (ptr)
{
auto fun = std::bind(&A::getData, ptr, std::placeholders::_1);
...
}
如今,lambda 已經取代std::bind
來創建 function 個對象。 你正在做的等效 lambda 是:
auto fun = [a](std::string str) { return a->getData(str); }
現在對a
使用nullptr
是沒有意義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.