You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用std::list<shared_ptr>的范围for循环无输出问题排查

问题根源:你根本没往列表C里添加任何元素

咱们一步步拆解问题:

  1. 初始列表是空的,迭代器指向尾后位置
    你的C是std::list<shared_ptr<A<T1>>>类型,默认构造后是个空列表。此时auto iter = C.begin();拿到的是列表的尾后迭代器(和C.end()完全相等),这个迭代器是不能被解引用的——这属于C++里的未定义行为。

  2. 循环里的赋值操作无效,甚至危险
    你在循环里写*iter = make_shared<...>,试图给空迭代器指向的位置赋值,但空列表根本没有这个位置。调试段1能输出纯粹是巧合(比如内存暂时没崩溃,临时创建的对象还能被访问到),但实际上这些新创建的shared_ptr根本没被添加到C里。

  3. 调试段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:33:42