自定义类工作异常的 C++ 初始化程序列表

问题描述 投票:0回答:1

任何人都可以帮我理解下面的代码有什么问题吗?

我正在使用C++20

我正在初始化“Interval”类向量的向量,但它被初始化为 0。

#include <bits/stdc++.h>
using namespace std;

class Interval {
public:
    int start;
    int end;

    Interval() {}

    Interval(int _start, int _end) {
        start = _start;
        end = _end;
    }
};

vector<Interval> solve(vector<vector<Interval>> schedule) {
    vector<Interval> allSchedule;

    for(auto it : schedule) {
        for(auto it1 : it) {
            allSchedule.push_back(it1);
        }
    }

    auto comparator = [](Interval a, Interval b) {
        return a.start > b.start;
    };
    sort(allSchedule.begin(), allSchedule.end(), comparator);

    return allSchedule;
}

int main() {
    vector<vector<Interval>> schedule;
    schedule.push_back({new Interval(1,2), new Interval(5,6)});
    schedule.push_back({new Interval(1,3), new Interval(4,10)});
    vector<Interval> allSchedules = solve(schedule);
    for(auto it : allSchedules) {
        cout << it.start << " -> " << it.end << endl;
    }
    return 0;
}

得到以下输出(意外)

1 -> 2
1 -> 3
0 -> 0
0 -> 0
c++ initializer-list
1个回答
0
投票
vector<vector<Interval>> schedule;
schedule.push_back({new Interval(1,2), new Interval(5,6)});

这是一个非常奇怪的错误,因为

vector
有一个构造函数,可用于将其从两个指针(迭代器)初始化到其他容器,例如:

Interval intervals[2];
vector<vector<Interval>> schedule;
schedule.push_back({ &(intervals[0]), &(intervals[2])});

在您的情况下,两个指针不指向同一个容器,因此这是未定义的行为,并且 address santizer 将其标记为缓冲区溢出

© www.soinside.com 2019 - 2024. All rights reserved.