В C ++ функция, возвращающая вектор пользовательской структуры данных, выдает ошибку сегментации - PullRequest
0 голосов
/ 02 сентября 2018

Моя программа компилируется, проблема во время выполнения.

У меня есть следующая программа на C ++:

#include <iostream>
#include <vector>
#include <string>

struct SpotifyRelease {
    std::string release_date, id, href, name;
};


SpotifyRelease get_release(const std::string id, const std::string href, const std::string name, const std::string release_date) {
    SpotifyRelease sr;
    sr.id = id;
    sr.href = href;
    sr.name = name;
    sr.release_date = release_date;
    return sr;
}

std::vector<SpotifyRelease> spotify_get_latest_releases() {
    std::vector<SpotifyRelease> v1;
    std::vector<SpotifyRelease>::iterator it;
    v1.insert(it, get_release("1OyADPvYTlmT5hV0mtxLAY", "https://api.spotify.com/v1/albums/1OyADPvYTlmT5hV0mtxLAY", "Bloom", "2018-08-31"));
    v1.insert(it, get_release("3HNnxK7NgLXbDoxRZxNWiR", "https://api.spotify.com/v1/albums/3HNnxK7NgLXbDoxRZxNWiR", "Kamikaze", "2018-08-31"));
    v1.insert(it, get_release("1Xf5RZ7zQjF2WEkk7KpZVi", "https://api.spotify.com/v1/albums/1Xf5RZ7zQjF2WEkk7KpZVi", "Superhero", "2018-08-30"));
    v1.insert(it, get_release("317hvEJEf6RTxPT4m2NiRb", "https://api.spotify.com/v1/albums/317hvEJEf6RTxPT4m2NiRb", "4Freedom", "2018-08-30"));
    v1.insert(it, get_release("6ggnUqpjfkDULwX0dr164j", "https://api.spotify.com/v1/albums/6ggnUqpjfkDULwX0dr164j", "XTCY", "2018-08-30"));
    v1.insert(it, get_release("6ST7naJFCe9iBeOleU5Ccu", "https://api.spotify.com/v1/albums/6ST7naJFCe9iBeOleU5Ccu", "Michael Jackson x Mark Ronson: Diamonds are Invincible", "2018-08-29"));
    v1.insert(it, get_release("6OX3blc5vb3huGk2PTM0Kk", "https://api.spotify.com/v1/albums/6OX3blc5vb3huGk2PTM0Kk", "The Dark Side / Something Human / Thought Contagion / Dig Down", "2018-08-30"));
    v1.insert(it, get_release("4o8Y3L9WQvk3L3u9M0gngq", "https://api.spotify.com/v1/albums/4o8Y3L9WQvk3L3u9M0gngq", "Don't Leave Me Alone (feat. Anne-Marie) [Oliver Heldens Remix]", "2018-08-31"));
    v1.insert(it, get_release("0LOJHhz9ybWLVMLucHYtCe", "https://api.spotify.com/v1/albums/0LOJHhz9ybWLVMLucHYtCe", "REMEDY", "2018-08-31"));
    v1.insert(it, get_release("1d1MKgYRqFUs8Mner4uF4y", "https://api.spotify.com/v1/albums/1d1MKgYRqFUs8Mner4uF4y", "Hola", "2018-08-31"));
    v1.insert(it, get_release("3qX5J1RkaFxSXEqRc8Qzmo", "https://api.spotify.com/v1/albums/3qX5J1RkaFxSXEqRc8Qzmo", "Amigos Con Derechos", "2018-08-31"));
    v1.insert(it, get_release("3OLSEsIMEgtcn1U9s03qRR", "https://api.spotify.com/v1/albums/3OLSEsIMEgtcn1U9s03qRR", "BEBE", "2018-08-31"));
    v1.insert(it, get_release("2qIbHfs93z6eDwGoAdCkXA", "https://api.spotify.com/v1/albums/2qIbHfs93z6eDwGoAdCkXA", "8 Letters", "2018-08-31"));
    v1.insert(it, get_release("3LBRCisCaxgQjb5nwSMPgU", "https://api.spotify.com/v1/albums/3LBRCisCaxgQjb5nwSMPgU", "Big Red Machine", "2018-08-31"));
    v1.insert(it, get_release("29KdLwIDFZ8DSSgxOQ8kLa", "https://api.spotify.com/v1/albums/29KdLwIDFZ8DSSgxOQ8kLa", "Love Wins", "2018-08-31"));
    v1.insert(it, get_release("1aG5r6TZdMVUeNGY6Lf4YP", "https://api.spotify.com/v1/albums/1aG5r6TZdMVUeNGY6Lf4YP", "Never Comin Down", "2018-08-31"));
    v1.insert(it, get_release("0AykQgBtKmWJkQvomIKYSF", "https://api.spotify.com/v1/albums/0AykQgBtKmWJkQvomIKYSF", "Rotation 112th (feat. Rich The Kid) [Remix]", "2018-08-31"));
    v1.insert(it, get_release("28cah7y6l6TUl5G7aP5pZf", "https://api.spotify.com/v1/albums/28cah7y6l6TUl5G7aP5pZf", "Serious", "2018-08-30"));
    v1.insert(it, get_release("1xKEX6KhO9pRM85WT7aOel", "https://api.spotify.com/v1/albums/1xKEX6KhO9pRM85WT7aOel", "Weed Garden", "2018-08-31"));
    v1.insert(it, get_release("5eOlKFDAN9dXwYycRqEmnP", "https://api.spotify.com/v1/albums/5eOlKFDAN9dXwYycRqEmnP", "Flow State", "2018-08-31"));
    return v1;
}

int main() {
    std::vector<SpotifyRelease> latest_releases;
    SpotifyRelease release;
    latest_releases = spotify_get_latest_releases();
    return 0;
}

Проблема в том, что когда я пытаюсь запустить программу, моя программа завершается с кодом 11 во второй строке int main()

Я не совсем уверен, почему, поскольку программа выглядит хорошо для меня.

Любая помощь в правильном направлении будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Вы передаете неинициализированный итератор в insert. Это неопределенное поведение.

Возможно, вы имели в виду что-то вроде auto it = begin(v1);, но это все равно не сработает, поскольку вы нигде не переназначаете it, и std::vector::insert может сделать недействительными все существующие итераторы для элементов вектора.

Полагаю, вы не хотите использовать insert в любом случае. Просто используйте push_back:

v1.push_back(get_release("1OyADPvYTlmT5hV0mtxLAY", "https://api.spotify.com/v1/albums/1OyADPvYTlmT5hV0mtxLAY", "Bloom", "2018-08-31"));
// ...
0 голосов
/ 02 сентября 2018

Проблема в том, что вы звоните insert() с неинициализированным, недействительным iterator. Чтобы заставить его работать, вам нужно как инициализировать итератор, так и поддерживать его действительным, обновляя его с возвращаемого значения или insert(), например:

std::vector<SpotifyRelease>::iterator it{v1.begin()};
it = v1.insert(it, get_release("1OyADPvYTlmT5hV0mtxLAY", "https://api.spotify.com/v1/albums/1OyADPvYTlmT5hV0mtxLAY", "Bloom", "2018-08-31"))++;
...

Но в вашем случае проще просто поменять эти строки v1.insert(...); так, чтобы вообще не было iterator:

v1.push_back(get_release("1OyADPvYTlmT5hV0mtxLAY", "https://api.spotify.com/v1/albums/1OyADPvYTlmT5hV0mtxLAY", "Bloom", "2018-08-31"));
...

Или, что еще лучше, совсем не нужно использовать get_release() при отсутствии дальнейших неуказанных причин - вы можете сэкономить все потенциальное копирование туда-сюда и просто сделать это:

v1.push_back({"1OyADPvYTlmT5hV0mtxLAY", "https://api.spotify.com/v1/albums/1OyADPvYTlmT5hV0mtxLAY", "Bloom", "2018-08-31"});
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...