2017-01-01 30 views
-4

我是编程新手,我试图编写一个从列表中获取最短字符串的函数,但每次运行它时,Visual Studio都会显示错误“抛出的异常:读取访问冲突”。错误在哪里?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

我不知道谁downvotes没有解释什么是错的答案。 – Swift

+1
+0

@IInspectable哦,万一空列表我同意,整个功能应该短路返回空,是的。如果给定非法数据或产生错误,或者返回空结果,函数应该会崩溃,这是一个问题。对于随机访问迭代器,'it Swift

1

if (shortest_one = nullptr)不是比较操作。这是转让,即设置shortest_onenullptr。此操作评估为0,因此if表达式等效于if (0)if (false)

然后在else块,您正在使用shortest_one->size()shortest_one是空...

尝试使用if (shortest_one == nullptr)代替。

+0

仍然收到错误。 – Pinwar78

+0

@ Pinwar78:不要责怪回答者。通过提供真实的代码和解释,提出一个真正的问题,哪一行产生访问冲突。调用堆栈也有帮助。 – IInspectable

+0

@ Pinwar78你得到的错误是什么? – nrofis

相关问题