2017-01-01 3 views
-4

Я новичок в программировании, и я пытаюсь закодировать функцию, которая получает кратчайшую строку из списка, но каждый раз, когда я ее запускаю, визуальная студия показывает ошибку «Исключение брошено: нарушение прав доступа на чтение». Где ошибка?C++ Почему моя программа бросает исключение?

#include <iostream> 
#include <string> 
using namespace std; 

const string &shortest_string(initializer_list<string> strings) { 
    string *shortest_one = nullptr; 
    for (string string : strings) { 
     if (shortest_one == nullptr) shortest_one = &string; 
     else { 
      if (string.size() < shortest_one->size()) shortest_one = &string; 
     } 
    } 
    return *shortest_one; 
} 

int main() { 
    cout << shortest_string({ "hello" , "my", "name", "is", "dan" }) << endl; 
    return 0; 
} 
+2

Потому что 'string string: ...' создает временную переменную, которая существует в течение одного цикла цикла и уничтожается в следующем цикле. И вы берете указатель на него (что указывает на освобожденную память) – myaut

+0

'if (shortest_one = nullptr)' - Как вы думаете, что это делает? –

+0

Итак, теперь, когда вы задали второй, другой вопрос, когда мы увидим реальный код, вы увидите поведение? – IInspectable

ответ

-1

Вы указали переменную с именем, которое соответствует типу имени (строковая переменная, тип строки?). Кроме того, есть проблема, что вы возвращаете указатель на объект с локальным охватом жизни. Это UB. Используя итераторы, ваша функция будет работать следующим образом:

const string shortest_string(initializer_list<string> strings) { 
    if(!strings.size()) return string(); 
    auto shortest_one = strings.begin(); 
    for (auto it = shortest_one+1; it < strings.end(); it++ ) 
    { 
     shortest_one = (it->size()< shortest_one->size()) ? it : shortest_one; 
    } 

    return *shortest_one; 
} 
+1

Я задаюсь вопросом, кто уменьшает ответы, не объясняя, что не так. – Swift

+1
+0

@Inpectable oh, в случае пустого списка я согласен, вся функция должна быть короткозамкнута, чтобы вернуть пустую, да. Задача архитектона заключается в том, что функция должна сбой при получении незаконных данных или генерации ошибки или возврата пустых результатов. И 'it Swift

1

if (shortest_one = nullptr) не является операцией сравнения. Назначение , которое устанавливает shortest_one в nullptr. Эта операция оценивается как 0, поэтому выражение if эквивалентно if (0), или if (false).

Тогда в else блоке, вы используете shortest_one->size() но shortest_one равно нулю ...

Попробуйте использовать if (shortest_one == nullptr) вместо этого.

+0

Все еще получаю сообщение об ошибке. – Pinwar78

+0

@ Pinwar78: Не обвиняйте ответчика. Задайте реальный вопрос, предоставив реальный код с объяснением, какая строка вызывает нарушение доступа. Также поможет стек вызовов. – IInspectable

+0

@ Pinwar78 Какая ошибка вы получаете? – nrofis

Смежные вопросы