[Bug c++/86256] New: Lambda will not add ref count for class intelligent pointer member when capture 'this' or & as argument
kangchuanbo at 126 dot com
gcc-bugzilla@gcc.gnu.org
Thu Jun 21 04:07:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86256
Bug ID: 86256
Summary: Lambda will not add ref count for class intelligent
pointer member when capture 'this' or & as argument
Product: gcc
Version: 5.4.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: kangchuanbo at 126 dot com
Target Milestone: ---
For example:
#include <iostream>
#include <memory>
class A {
public:
A(){
tmp = std::make_shared<int>(1);
}
void start() {
std::cout << "ref count : " << tmp.use_count() << std::endl;
std::shared_ptr<int> tmp2 = tmp;
std::cout << "ref count : " << tmp.use_count() << std::endl;
auto xxfunca = [this]() { std::cout<<"func1 ref count :
"<<tmp.use_count() << std::endl; };
std::cout << "ref count : " << tmp.use_count() << std::endl;
auto xxfuncb = [tmp2]() { std::cout<<"func2 ref count :
"<<tmp2.use_count() << std::endl; };
std::cout << "ref count : " << tmp.use_count() << std::endl;
auto xxfuncc = [&]() { std::cout<<"func2 ref count : "<<tmp.use_count()
<< std::endl; };
std::cout << "ref count : " << tmp.use_count() << std::endl;
}
private:
std::shared_ptr<int> tmp;
};
int main()
{
A a;
a.start();
return 0;
}
result and analyse:
[root~]]# ./test
ref count : 1 // tmp init ref count = 1
ref count : 2 // copy to tmp2,tmp ref count will incrase to 2
ref count : 2 // Lambda capture this,tmp ref count no incrase
ref count : 3 // Lambda capture tmp2,tmp ref count incrase to 3
ref count : 3 // Lambda capture &,tmp ref count no incrase
==========
The compiler will not copy class member, may feel too complex to check class
member, but should give warning or error to user when lambda capture Class with
intelligent member, or user may meet null pointer which lead to coredump.
Thanks.
More information about the Gcc-bugs
mailing list