bugprone-capturing-this-in-member-variable

Finds lambda captures that capture the this pointer and store it as class members without handle the copy and move constructors and the assignments.

Capture this in a lambda and store it as a class member is dangerous because the lambda can outlive the object it captures. Especially when the object is copied or moved, the captured this pointer will be implicitly propagated to the new object. Most of the time, people will believe that the captured this pointer points to the new object, which will lead to bugs.

struct C {
  C() : Captured([this]() -> C const * { return this; }) {}
  std::function<C const *()> Captured;
};

void foo() {
  C v1{};
  C v2 = v1; // v2.Captured capture v1's 'this' pointer
  assert(v2.Captured() == v1.Captured()); // v2.Captured capture v1's 'this' pointer
  assert(v2.Captured() == &v2); // assertion failed.
}
Possible fixes:
  • marking copy and move constructors and assignment operators deleted.

  • using class member method instead of class member variable with function object types.

  • passing this pointer as parameter

FunctionWrapperTypes

A semicolon-separated list of names of types. Used to specify function wrapper that can hold lambda expressions. Default is ::std::function;::std::move_only_function;::boost::function.