使用std::list<shared_ptr>的范围for循环无输出问题排查
问题根源:你根本没往列表
C里添加任何元素 咱们一步步拆解问题:
初始列表是空的,迭代器指向尾后位置
你的C是std::list<shared_ptr<A<T1>>>类型,默认构造后是个空列表。此时auto iter = C.begin();拿到的是列表的尾后迭代器(和C.end()完全相等),这个迭代器是不能被解引用的——这属于C++里的未定义行为。循环里的赋值操作无效,甚至危险
你在循环里写*iter = make_shared<...>,试图给空迭代器指向的位置赋值,但空列表根本没有这个位置。调试段1能输出纯粹是巧合(比如内存暂时没崩溃,临时创建的对象还能被访问到),但实际上这些新创建的shared_ptr根本没被添加到C里。调试段2自然没输出
因为C从头到尾都是空的,遍历一个空列表当然不会有任何输出。
修正方案
把循环里的代码改成用list的push_back(或push_front)来添加元素,这才是标准的列表插入方式:
template<typename T1, typename T2> B<T1, T2>::B(int I, T2& rData){ //创建三个A<T>类型的dummy shared_ptr实例的临时方案 vector<shared_ptr<A<T1>>>dummys(3); for(int count = 0; count < I ; ++count) { auto new_ptr = make_shared<A<T1>>(rData[count], dummys[0], dummys[1], dummys[2] ); C.push_back(new_ptr); // 调试代码段1可以改成这样,更安全 #ifdef DEBUG std::cout << new_ptr->getData() << std::endl; #endif } // 现在调试段2就能正常输出了 for(auto Aref : C) { std::cout << Aref->getData() << std::endl; } }
额外提醒
另外注意一个潜在的严重问题:你的A类里的X、Y、Z都是shared_ptr<A<T>>&引用,构造函数里绑定的是局部变量dummys里的元素引用。当dummys在构造函数结束后销毁,这些引用会变成悬空引用,后续访问会导致未定义行为。如果需要长期持有,应该把这些成员改成shared_ptr<A<T>>值而不是引用。
内容的提问来源于stack exchange,提问作者user9196120
相关产品推荐
相关产品推荐

